在業務開發中,我們經常需要進行
Date
與LocalDateTime
的相互轉換。
下面我們一起來學習一下吧!
talk is cheap, show me the code.
Date ⇒ LocalDateTime
- 方式一:使用 Instant 的
atZone
進行轉換 - 方式二:使用 LocalDateTime 的
ofEpochSecond
進行轉換 - 方式三:使用 LocalDateTime 的
ofInstant
進行轉換(封裝的 ofEpochSecond 方法)
Date date = new Date();
// @since 1.8
Instant instant = date.toInstant();
// 設置時區
ZoneOffset zoneOffset = ZoneOffset.of("+8");
// 方式一:使用 Instant 的 atZone 進行轉換
LocalDateTime localDateTime1 = instant.atZone(zoneOffset).toLocalDateTime();
LocalDate localDate = instant.atZone(zoneOffset).toLocalDate();
LocalTime localTime = instant.atZone(zoneOffset).toLocalTime();
// 方式二:使用 LocalDateTime 的 ofEpochSecond 進行轉換
LocalDateTime localDateTime2 = LocalDateTime.ofEpochSecond(instant.getEpochSecond(), instant.getNano(), zoneOffset);
// 方式三:使用 LocalDateTime 的 ofInstant 進行轉換(封裝的 ofEpochSecond 方法)
LocalDateTime localDateTime3 = LocalDateTime.ofInstant(instant, zoneOffset);
LocalDateTime ⇒ Date
LocalDateTime now = LocalDateTime.now();
// 設置時區
ZoneOffset zoneOffset = ZoneOffset.of("+8");
Instant instant = now.toInstant(zoneOffset);
// @since 1.8
Date date = Date.from(instant);
擴展
Instant
:表示時刻,不直接對應年月日信息,需要通過時區轉換LocalDateTime
: 表示與時區無關的日期和時間信息,不直接對應時刻,需要通過時區轉換LocalDate
:表示與時區無關的日期,與LocalDateTime相比,只有日期信息,沒有時間信息LocalTime
:表示與時區無關的時間,與LocalDateTime相比,只有時間信息,沒有日期信息ZonedDateTime
: 表示特定時區的日期和時間ZoneId/ZoneOffset
:表示時區
時間格式化
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now()));
System.out.println(DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalTime.now()));
控制檯輸出
2020-06-13 12:42:49
2020-06-13
12:42:49