Java日期发展:
java 1.0 时候主要日期操作由Date类操作日期,因为设计不合理(比如月份是从0开始 0月即对应 1月, 年份是从1900年开始 增量表示),目前大部分已弃用
java 1.1 java.util.Calendar 类主要负责操作日期,虽已有改进,但仍有不合理之处,比如月份依旧从0开始,Date,和Calendar 非final ,可更改, DateFormator 非线程安全。
java 8 新增了 java.time.LocalDate & LocalTime & Instant & Duration & Period 可以根据合理和方便的来操纵日期
Java日期概述:
java 日期主要由 1. java.util.Date
- java.sql.Date
- java.sql.Time
- java.sql.TimeStamp
2. Calendar
3. DateFormat
- SimpleDateFormat
ps : - 为对应的实现类 即 java.sql.Date 继承于 java.util.Date
其中 Date类 主要用于显示日期类型,其为java1.0的类库,大部分API 已弃用。
Calendar 类主要负责对日期的操作。
DateFromat 主要负责日期的格式化,如将固定格式的string日期转化为Date格式,将Date格式化为对应的string日期。
常用API:
1. java.util.Date 中的 after(), before() 方法比两个日期。
private static void testDateMethod() { /** * java.util.Date中的比较日期 * before() ; after() ; 方法 */ Date date1 = new Date(); date1.setTime(1510493100); //2017/11/12 21:25:0 Date date2 = new Date(); date2.setTime(1510488000); //2017/11/12 20:00:0 System.out.println("date1 before date2 :" + date1.before(date2)); //false System.out.println("date1 after date2 :" + date1.after(date2)); //true // x轴 0点到24点 前->后 // date1.after(date2) 可翻译为 date1在date2之后 }
2. Calendar 类操作日期:新增月份,日期
/** * 增加日期中某些类型的某数值 * @param date java.util * @param dateType * @param amount * @return java.date */ public static Date addInteger(Date date, int dateType, int amount) { Date myDate = null; if (date != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(dateType, amount); myDate = calendar.getTime(); } return myDate; }
3. DateSimpleDateFormat 日期格式化 Date -> String (format()方法)
/** * date -> string format方法 * * @param date * @return */ public static String utilDateToString(Date date) { String strDate = null; if (date != null) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); strDate = format.format(date); } return strDate; }
4. SimpleDateFormat : String -> Date (parse()方法)
/** * str -> date parse方法 * @param strDate * @param paternStr * @return */ public static Date stringToUtilDate(String strDate,String paternStr) { Date date; try { SimpleDateFormat format = new SimpleDateFormat(paternStr); date= format.parse(strDate); } catch (Exception e) { date = null; } return date; }
Java 8新增API :
LocalDate : 只表示 日期 如 2018-04-05
LocalTime : 只表示 时间 如 12:45:05
LocalDateTime : 为LocalDate 和 LocalTime 的结合体
Instant : 主要为机器设计的API
Duration : 计算两个时间的间隔,主要用纳秒和秒 来显示间隔
Period : 计算日期的间隔,主要用年月日来计算间隔
//1. 当前日期 & 获取当前日期的日 LocalDate localDate = LocalDate.now(); System.out.println("day: " + localDate.get(ChronoField.DAY_OF_MONTH)); //2. parse LocalDate localDate1 = LocalDate.parse("2017-03-14"); System.out.println(localDate1); //3. format LocalDateTime now = LocalDateTime.now(); System.out.println("now: " + now.format(DateTimeFormatter.BASIC_ISO_DATE)); //yyyyMMdd System.out.println("now: " + now.format(DateTimeFormatter.ISO_LOCAL_DATE)); //yyyy-MM-dd System.out.println("now: " + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); //2018-04-07T22:40:15.691 System.out.println("now: " + now.format(DateTimeFormatter.ISO_LOCAL_TIME)); //22:40:15.691 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"); System.out.println("now: " + now.format(formatter)); //20180407 22:44:14 //4. 日期比较 String strDate1 = "2018-05-17"; String strDate2 = "2018-06-15"; LocalDate ld1 = LocalDate.parse(strDate1, DateTimeFormatter.ISO_LOCAL_DATE); LocalDate ld2 = LocalDate.parse(strDate2, DateTimeFormatter.ISO_LOCAL_DATE); System.out.println(ld1.isBefore(ld2)); // true //5. duration LocalTime localTime = LocalTime.of(12, 10); LocalTime localTime1 = LocalTime.of(12, 11); Duration d1 = Duration.between(localTime, localTime1); System.out.println("12:10 <> 12:11 between seconds => " + d1.getSeconds()); //6. period LocalDate ld11 = LocalDate.of(2018, 3, 11); LocalDate ld22 = LocalDate.of(2018, 4, 11); Period period = Period.between(ld11, ld22); long interval = ld11.until(ld22, ChronoUnit.DAYS); System.out.println("between day => " + interval);
PS: UTC时间
UTC: 世界协调时间
GMT: 格林尼治标准时
UTC是给予原子钟的 比 GMT更精确
案例:
北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。
如果在电子邮件的信头中有这么一行:
Date: Fri, 08 Nov 2002 09:42:22 +0800
说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800, 就是东八区时间)。
电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午