关键词

传统Date/Calendar类存在的问题

  1. 非线程安全, Date, Calendar不是线程安全的
  2. API不容易理解和使用,不用多说,不同时间格式的转换还是比较麻烦的.
  3. 时区逻辑,需要自己实现时区转换逻辑

java8相关类

java.time包下有多个相关类
LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Period, Duration以及相关API.

LocalDate , LocalTime

ISO format (yyyy-MM-dd), 无时间. 可表达特定日期

LocalDate.of(2015, 02, 20);
LocalDate.parse("2015-02-20");
需要记住的几个方法:
of();
parse();

LocalDateTime

是上面两个的结合,特征都是一致的

ZonedDateTime
  Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
  ZoneId zoneId = ZoneId.of("Europe/Paris");
  ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
  ZonedDateTime.parse("2015-05-03T10:15:30+01:00[Europe/Paris]");
Instant
Instant expectedDate = Instant.parse("2020-09-08T12:16:40Z");
long seconds = 1599567400L;
Instant date = Instant.ofEpochSecond(seconds);

与Date/Calendar的兼容性

LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());

转换

Date/Time的排版

LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
String localDateString = localDateTime.format(DateTimeFormatter.ISO_DATE);
localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
localDateTime
  .format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
  .withLocale(Locale.UK));

向后兼容

如果java17的项目想要兼容java7/6, 可以考虑使用:

<dependency>
    <groupId>org.threeten</groupId>
    <artifactId>threetenbp</artifactId>
    <version>1.3.1</version>
</dependency>

或:

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.9.4</version>
</dependency>

Instant相关方法


yizheng
301 声望27 粉丝

一蓑烟雨任平生