[javatips]Datatime轉換-java8最新方法

發表於2024-02-11

關鍵詞

傳統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相關方法