新的JAVA时间API

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。对日期与时间的操作一直是Java程序员最痛苦的地方之一。标准的 java.util.Date以及后来的java.util.Calendar一点没有改善这种情况(可以这么说,它们一定程度上更加复杂)。

Clock类

它通过指定一个时区,然后就可以获取到当前的时刻,日期与时间。Clock可以替换System.currentTimeMillis()与TimeZone.getDefault()。

  1. // Get the system clock as UTC offset
  2. final Clock clock = Clock.systemUTC();
  3. System.out.println(clock.instant());
  4. System.out.println(clock.millis());

输出结果:

  1. 2019-01-09T14:52:50.111Z
  2. 1547045570335

LocaleDate与LocalTime

LocaleDate只持有ISO-8601格式且无时区信息的日期部分。相应的,LocaleTime只持有ISO-8601格式且无时区信息的时间部分。LocaleDate与LocalTime都可以从Clock中得到。

  1. // Get the local date and local time
  2. final LocalDate date = LocalDate.now();
  3. final LocalDate dateFromClock = LocalDate.now(clock);
  4. System.out.println(date);
  5. System.out.println(dateFromClock);
  6. // Get the local date and local time
  7. final LocalTime time = LocalTime.now();
  8. final LocalTime timeFromClock = LocalTime.now(clock);
  9. System.out.println(time);
  10. System.out.println(timeFromClock);

输出结果:

  1. 2019-01-09
  2. 2019-01-09
  3. 22:52:50.383
  4. 14:52:50.383

LocaleDateTime

LocaleDateTime把LocaleDate与LocaleTime的功能合并起来,它持有的是ISO-8601格式无时区信息的日期与时间。

  1. // Get the local date/time
  2. final LocalDateTime datetime = LocalDateTime.now();
  3. final LocalDateTime datetimeFromClock = LocalDateTime.now(clock);
  4. System.out.println(datetime);
  5. System.out.println(datetimeFromClock);

输出结果:

  1. 2019-01-09T22:55:05.194
  2. 2019-01-09T14:55:05.194

ZonedDateTime

如果你需要特定时区的日期/时间,那么ZonedDateTime是你的选择。它持有ISO-8601格式具具有时区信息的日期与时间。

  1. // Get the zoned date/time
  2. final ZonedDateTime zonedDatetime = ZonedDateTime.now();
  3. final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now(clock);
  4. final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
  5. System.out.println(zonedDatetime);
  6. System.out.println(zonedDatetimeFromClock);
  7. System.out.println(zonedDatetimeFromZone);

输出结果:

  1. 2019-01-09T22:56:34.033+08:00[Asia/Shanghai]
  2. 2019-01-09T14:56:34.033Z
  3. 2019-01-09T06:56:34.035-08:00[America/Los_Angeles]

Duration

在秒与纳秒级别上的一段时间。Duration使计算两个日期间的不同变的十分简单。

  1. final LocalDateTime from = LocalDateTime.of(2018, Month.APRIL, 16, 0, 0, 0);
  2. final LocalDateTime to = LocalDateTime.of(2019, Month.APRIL, 16, 23, 59, 59);
  3. final Duration duration = Duration.between(from, to);
  4. System.out.println("Duration in days: " + duration.toDays());
  5. System.out.println("Duration in hours: " + duration.toHours());

上面的例子计算了两个日期2018年4月16号与2019年4月16号之间的过程。下面是输出结果:

  1. Duration in days: 365
  2. Duration in hours: 8783