眾所周知,Java 8 之前的 Date 相關(guān)的時(shí)間類非常的不好用。從 Java 8 之后開(kāi)始加入了 LocalDate 等一系列更加現(xiàn)代化的時(shí)間類。
這就衍生出 Java 8 之前的 Date 需要和 LocalDate 互相轉(zhuǎn)換的需求。今天把這幾年積累下來(lái)的轉(zhuǎn)換代碼分享給大家。
java.util.Date 與 java.time.LocalDate 之間的轉(zhuǎn)換
在 Date 轉(zhuǎn)換 LocalDate 的過(guò)程中,我們使用 Date 類中在 Java 8 新增的 toInstant() 方法進(jìn)行轉(zhuǎn)換。
當(dāng)我們轉(zhuǎn)換一個(gè) Instant 對(duì)象時(shí),需要使用 ZoneId,因?yàn)?Instant 對(duì)象是不分時(shí)區(qū)的--只是時(shí)間線上的點(diǎn)。
Instant 對(duì)象的 atZone(ZoneId zone) API 返回一個(gè) ZonedDateTime,所以我們只需要使用 toLocalDate() 方法從中提取 LocalDate。
在這里我們使用的是系統(tǒng)默認(rèn)的 ZoneId。
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
還有一個(gè)類似的解決方案,但不同的方式來(lái)創(chuàng)建一個(gè) Instant 對(duì)象--使用 ofEpochMilli() 方法。
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
在我們繼續(xù)之前,讓我們也快速看一下舊的 java.sql.Date 類,以及它是如何被轉(zhuǎn)換為 LocalDate 的。
從 Java 8 開(kāi)始,我們可以在 java.sql.Date 上找到一個(gè)額外的 toLocalDate() 方法,這也給了我們一個(gè)將其轉(zhuǎn)換為 java.time.LocalDate 的簡(jiǎn)單方法。
在這種情況下,我們不需要擔(dān)心時(shí)區(qū)的問(wèn)題。
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
將 Date 轉(zhuǎn)換為 LocalDateTime
為了得到一個(gè) LocalDateTime 實(shí)例,我們同樣可以使用一個(gè)中間的 ZonedDateTime,然后使用 toLocalDateTime() API。
就像以前一樣,我們可以使用兩種可能的解決方案來(lái)從java.util.Date中獲得一個(gè)即時(shí)對(duì)象。
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
從Java 8開(kāi)始,我們也可以使用java.sql.Timestamp來(lái)獲得一個(gè)LocalDateTime。
public LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
return new java.sql.Timestamp(
dateToConvert.getTime()).toLocalDateTime();
}
將 LocalDate轉(zhuǎn)換為 Date
現(xiàn)在我們已經(jīng)很好地理解了如何從舊的數(shù)據(jù)表示法轉(zhuǎn)換為新的數(shù)據(jù)表示法,讓我們來(lái)看看另一個(gè)方向的轉(zhuǎn)換。
我們將討論將LocalDate轉(zhuǎn)換為Date的兩種可能方式。
第一種,我們使用java.sql.Date對(duì)象中提供的一個(gè)新的valueOf(LocalDate date)方法,它把LocalDate作為一個(gè)參數(shù)。
public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
return java.sql.Date.valueOf(dateToConvert);
}
正如我們所看到的,它毫不費(fèi)力,而且很直觀。它使用本地時(shí)區(qū)進(jìn)行轉(zhuǎn)換(所有的工作都在引擎蓋下完成,所以不用擔(dān)心)。
在另一個(gè)Java 8的例子中,我們使用一個(gè)Instant對(duì)象,并將其傳遞給java.util.Date對(duì)象的from(Instant instant)方法。
public Date convertToDateViaInstant(LocalDate dateToConvert) {
return java.util.Date.from(dateToConvert.atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
}
注意我們?cè)谶@里使用了一個(gè)即時(shí)對(duì)象,而且在做這個(gè)轉(zhuǎn)換時(shí)我們還需要關(guān)心時(shí)區(qū)。
接下來(lái),讓我們使用一個(gè)非常類似的解決方案,將LocalDateTime轉(zhuǎn)換為Date對(duì)象。
將java.time.LocalDateTime轉(zhuǎn)換為java.util.Date
從 LocalDateTime 獲得java.util.Date的最簡(jiǎn)單方法是使用java.sql.Timestamp的擴(kuò)展--在Java 8中可用。
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
return java.sql.Timestamp.valueOf(dateToConvert);
}
但當(dāng)然,另一個(gè)解決方案是使用一個(gè) Instant 對(duì)象,我們從ZonedDateTime中獲得這個(gè)對(duì)象。
Date convertToDateViaInstant(LocalDateTime dateToConvert) {
return java.util.Date
.from(dateToConvert.atZone(ZoneId.systemDefault())
.toInstant());
}
Java 9的新增功能
在 Java 9 中,有一些新方法可以簡(jiǎn)化java.util.Date和java.time.LocalDate或java.time.LocalDateTime之間的轉(zhuǎn)換。
LocalDate.ofInstant(Instant instant, ZoneId zone) 和 LocalDateTime.ofInstant(Instant instant, ZoneId zone) 提供了方便的快捷方式。
public LocalDate convertToLocalDate(Date dateToConvert) {
return LocalDate.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
public LocalDateTime convertToLocalDateTime(Date dateToConvert) {
return LocalDateTime.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
總結(jié)
在這篇文章中,介紹了將舊的java.util.Date轉(zhuǎn)換為新的java.time.LocalDate和java.time.LocalDateTime的方式方法。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7048瀏覽量
89073 -
JAVA
+關(guān)注
關(guān)注
19文章
2969瀏覽量
104783
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論