關鍵詞
傳統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>