JAVA8中新增了java.time包,新的处理日期时间的类都放在此包下。
此处介绍几个比较重要的类及其API:
LocalDateTime、LocalDate、LocalTime、Instant比较容易区分,很明显就能看到区别。
OffsetDateTime和ZonedDateTime则比较难以理解,在这重新说下这两个类的区别:
LocalDateTime dateTimeNow = LocalDateTime.now();
System.out.println("LocalDateTime=" + dateTimeNow.toString());
LocalDate dateNow = LocalDate.now();
System.out.println("LocalDate=" + dateNow.toString());
LocalTime timeNow = LocalTime.now();
System.out.println("LocalTime=" + timeNow.toString());
System.out.println("OffsetDateTime=" + OffsetDateTime.now());
System.out.println("ZonedDateTime=" + ZonedDateTime.now());
结果能很明显的看到几个类的区别,输出如下:
LocalDateTime=2018-04-17T19:53:54.500
LocalDate=2018-04-17
LocalTime=19:53:54.501
OffsetDateTime=2018-04-17T19:53:54.502+08:00
ZonedDateTime=2018-04-17T19:53:54.502+08:00[Asia/Shanghai]
//参数为:年、月、日、时、分、秒、纳秒
LocalDateTime dateTime = LocalDateTime.of(2015, 6, 12, 13, 14,15,504);
LocalDate date = LocalDate.of(2014, 2, 14);
// LocalDate date = LocalDate.of(2012, Month.of(2), 29);
LocalTime time = LocalTime.of(13, 14, 15);
System.out.println("dateTime="+dateTime);
System.out.println("date="+date);
System.out.println("time="+time);
其中month参数也可以写成Month.of(2)或者调用常量:Month.FEBRUARY。其中nanoOfSecond是纳秒,1纳秒=十亿分之一秒。输出如下:
dateTime=2015-06-12T13:14:15.000000504
date=2014-02-14
time=13:14:15
System.out.println("leapYear = " + date.isLeapYear());
输出如下:
leapYear = false
System.out.println("withYear="+date.withYear(2015));
System.out.println("plusYears="+date.plusYears(2015));
System.out.println("plusYears="+date.minusYears(2000));
//date值不变
System.out.println("date="+date);
所有以 “with“开头的方法都是替换参数里面的值;
所有以 “plus“开头的方法都是加上参数里面的值;
所有以 “minus“开头的方法都是减去参数里面的值;
使用 “with“、”plus“或者”minus“处理的方法,内部处理日期不存在的方式是不一样的,如”withDayOfMonth”和”withDayOfYear”处理是:如果参数中的日期不存在,则抛出异常。使用这些方法前可以看下方法的注释或者进入看下方法的源码就能知道内部是怎么处理的。
输出如下:
withYear=2015-02-14
plusYears=4029-02-14
plusYears=4014-02-14
date=2014-02-14
System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.N")));
System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.n")));
因为N是从当前日期0时0分0秒来计算的,所以正常情况应该不会与”HH:mm:ss”同时使用,此处为演示代码才放在一块。输出为:
2018-04-17 19:31:03.70263915000000
2018-04-17 19:31:03.927000000
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(LocalDateTime.parse(format,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println(LocalDateTime.parse(LocalDateTime.now().toString()));
输出为:
2018-04-17T19:45:59
2018-04-17T19:45:59.457
System.out.println(LocalDateTime.ofEpochSecond(1523951062,300, OffsetDateTime.now().getOffset()));
输出为:
2018-04-17T15:44:22.000000300
System.out.println(Instant.ofEpochSecond(System.currentTimeMillis()/1000).atOffset(OffsetDateTime.now().getOffset()));
System.out.println(Instant.ofEpochSecond(System.currentTimeMillis()/1000).atZone(ZonedDateTime.now().getZone()));
输出为:
2018-04-17T20:03:55+08:00
2018-04-17T20:03:55+08:00[Asia/Shanghai]
偏移对象:可以通过ZonedDateTime类或者OffsetDateTime类获取,如下:
ZoneOffset offset = ZonedDateTime.now().getOffset();
ZoneOffset offset1 = OffsetDateTime.now().getOffset();
时区对象:只能通过ZonedDateTime类获取,如下:
ZoneId zone = ZonedDateTime.now().getZone();
总结:
处理日期时间格式,可以使用LocalDateTime类;
处理日期格式,可以使用LocalDate类;
处理时间格式,可以使用LocalTime类;
如果处理需要偏移量的日期时间格式,可以使用OffsetDateTime类或者ZonedDateTime类;
如果处理和时区相关的日期时间格式,可以使用ZonedDateTime类。