关键词
传统Date/Calendar类存在的问题
- 非线程安全, Date, Calendar不是线程安全的
- API不容易理解和使用,不用多说,不同时间格式的转换还是比较麻烦的.
- 时区逻辑,需要自己实现时区转换逻辑
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>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。