Java中Date與LocalDateTime/LocalDate/LocalTime的相互轉換

java.util.Date 包含了日期、時間、毫秒數等
java.time.LocalDate 僅包含日期

Date對象的實例化方式有:
1. new Date()
2. new Date(long date):
	通過毫秒數初始化。毫秒數可以通過 java.sql.Timestamp對象的.getTime() 獲得
3. Date.from(Instant instant):
	通過 Instant 對象初始化。instant爲時刻、瞬間的意思
	Instant 可以由 ZonedDateTime 或 Timestamp 的實例對象調用 toInstant() 獲取

一、DateLocalDateTime/LocalDate/LocalTime

Date date = new Date();
// 時區
ZoneId zoneId = ZoneId.systemDefault();

// 方式1
ZonedDateTime zonedDateTime = date.toInstant().atZone(zoneId);
LocalDateTime localDateTime1 = zonedDateTime.toLocalDateTime();
LocalDate localDate1 = zonedDateTime.toLocalDate();
LocalTime localTime1 = zonedDateTime.toLocalTime();

// 方式2
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date.toInstant(), zoneId);
LocalDate localDate2 = localDateTime2.toLocalDate();
LocalTime localTime2 = localDateTime2.toLocalTime();

二、LocalDateTime/LocalDate/LocalTimeDate

1. LocalDateTimeDate

LocalDateTime now = LocalDateTime.now();
// 時區
ZoneId zoneId = ZoneId.systemDefault();

Instant instant = now.atZone(zoneId).toInstant();
Date date = Date.from(instant);

2. LocalDateDate

// 由於`LocalDate`不帶有時間信息,所以必須設置時間,才能轉 Date
LocalDate now = LocalDate.now();
System.out.println(now);
System.out.println("------");

// 時區
ZoneId zoneId = ZoneId.systemDefault();
Instant instant;
Date date;

// 方式1:atStartOfDay,自動賦予午夜時間,返回 LocalDateTime,設置時區返回 ZonedDateTime,進而得到 Instant
instant = now.atStartOfDay().atZone(zoneId).toInstant();
date = Date.from(instant);
System.out.println(date);

// 方式2
instant = now.atStartOfDay(zoneId).toInstant();
date = Date.from(instant);
System.out.println(date);

// 方式3:atStartOfDay 的底層實現
instant = now.atTime(LocalTime.MIDNIGHT).atZone(zoneId).toInstant();
date = Date.from(instant);
System.out.println(date);

// 方式4
instant = LocalDateTime.of(now, LocalTime.MIDNIGHT).atZone(zoneId).toInstant();
date = Date.from(instant);
System.out.println(date);

// 方式5:通過 Timestamp 得到 Instant
instant = Timestamp.valueOf(now.atTime(LocalTime.MIDNIGHT)).toInstant();
date = Date.from(instant);
System.out.println(date);

// 方式6
instant = Timestamp.valueOf(LocalDateTime.of(now, LocalTime.MIDNIGHT)).toInstant();
date = Date.from(instant);
System.out.println(date);

// 方式7:通過毫秒數初始化 Date 對象
Timestamp timestamp = Timestamp.valueOf(now.atTime(LocalTime.MIDNIGHT));
date = new Date(timestamp.getTime());
System.out.println(date);

3. LocalTimeDate

// 由於 LocalTime 不帶有日期信息,所以必須設置日期,才能轉 Date
LocalTime nowTime = LocalTime.now();
LocalDate nowDate = LocalDate.now();
System.out.println(nowTime);
System.out.println("------");

// 時區
ZoneId zoneId = ZoneId.systemDefault();
Instant instant;
Date date;

instant = LocalDateTime.of(nowDate, nowTime).atZone(zoneId).toInstant();
date = Date.from(instant);
System.out.println(date);

instant = Timestamp.valueOf(LocalDateTime.of(nowDate, nowTime)).toInstant();
date = Date.from(instant);
System.out.println(date);

Timestamp timestamp = Timestamp.valueOf(LocalDateTime.of(nowDate, nowTime));
date = new Date(timestamp.getTime());
System.out.println(date);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章