在 Java 中將長整型轉換為日期
1. 概述
在 Java 中處理日期時,我們經常會看到以long
數值表示的日期/時間值,這些值表示自紀元1970 年1 月1 日00:00:00 GMT 以來的天數、秒數或毫秒數。
在這個簡短的教學中,我們將探索在 Java 中將long
值轉換為日期的不同方法。首先,我們將解釋如何使用核心 JDK 類別來執行此操作。然後,我們將展示如何使用第三方 Joda-Time 庫實現相同的目標。
2. 使用 Java 8+ 日期時間 API
Java 8 因其為 Java 領域帶來的新 Date-Time API 功能而經常受到讚揚。引入此 API 主要是為了彌補舊版 API 的缺點。那麼,讓我們仔細看看這個 API 提供了什麼來回答我們的核心問題。
2.1.使用Instant
類別
最簡單的解決方案是使用新的 Java 8 日期時間 API 中引入的Instant
類別。此類描述時間軸上的單一瞬時點。
那麼,讓我們在實踐中來看看:
@Test
void givenLongValue_whenUsingInstantClass_thenConvert() {
Instant expectedDate = Instant.parse("2020-09-08T12:16:40Z");
long seconds = 1599567400L;
Instant date = Instant.ofEpochSecond(seconds);
assertEquals(expectedDate, date);
}
如上所示,我們使用ofEpochSecond()
方法建立了Instant
類別的物件。請記住,我們也可以使用ofEpochMilli()
方法來建立使用毫秒的Instant
實例。
2.2.使用LocalDate
類
LocalDate
是將long
值轉換為日期時要考慮的另一個選項。此類別對經典日期進行建模,例如 2023-10-17,沒有時間詳細資訊。
通常,我們可以使用LocalDate#ofEpochDay
方法來實現我們的目標:
@Test
void givenLongValue_whenUsingLocalDateClass_thenConvert() {
LocalDate expectedDate = LocalDate.of(2023, 10, 17);
long epochDay = 19647L;
LocalDate date = LocalDate.ofEpochDay(epochDay);
assertEquals(expectedDate, date);
}
ofEpochDay()
方法從給定紀元日創建LocalDate
類別的實例。
3. 使用舊版日期 API
在 Java 8 之前,我們通常會使用java.util
套件中的Date
或Calendar
類別來實現我們的目標。那麼,讓我們看看如何使用這兩個類別將long
值轉換為日期。
3.1.使用Date
類
Date
類別表示具有毫秒精度的特定時刻。顧名思義,它附帶了許多我們可以用來操作日期的方法。它提供了將long
值轉換為日期的最簡單方法,因為它提供了接受long
類型參數的重載構造函數。
那麼,讓我們看看它的實際效果:
@Test
void givenLongValue_whenUsingDateClass_thenConvert() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date expectedDate = dateFormat.parse("2023-10-15 22:00:00");
long milliseconds = 1689458400000L;
Date date = new Date(milliseconds);
assertEquals(expectedDate, date);
}
請注意, Date
類別已經過時,屬於舊 API。因此,這不是處理日期的最佳方法。
3.2.使用Calendar
類
另一個解決方案是使用舊日期 API 中的Calendar
類別。此類別提供了setTimeInMillis(long value)
方法,我們可以使用該方法將時間設定為給定的long
值。
現在,讓我們使用另一個測試案例來舉例說明此方法的使用:
@Test
void givenLongValue_whenUsingCalendarClass_thenConvert() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date expectedDate = dateFormat.parse("2023-07-15 22:00:00");
long milliseconds = 1689458400000L;
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(milliseconds);
assertEquals(expectedDate, calendar.getTime());
}
同樣,指定的long
值表示自紀元以來經過的毫秒數。
4. 使用 Joda-Time
最後,我們可以使用 Joda-Time 函式庫來應對我們的挑戰。首先,我們將其依賴項新增到pom.xml
檔案中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
同樣,Joda-Time 提供了它的LocalDate
類別版本。那麼,讓我們看看如何使用它將long
值轉換為LocalDate
物件:
@Test
void givenLongValue_whenUsingJodaTimeLocalDateClass_thenConvert() {
org.joda.time.LocalDate expectedDate = new org.joda.time.LocalDate(2023, 7, 15);
long milliseconds = 1689458400000L;
org.joda.time.LocalDate date = new org.joda.time.LocalDate(milliseconds, DateTimeZone.UTC);
assertEquals(expectedDate, date);
}
如圖所示, LocalDate
提供了一種從long
值建構日期的直接方法。
5. 結論
在這篇短文中,我們詳細解釋瞭如何在 Java 中將long
值轉換為日期。
首先,我們了解如何使用內建 JDK 類別進行轉換。然後,我們說明如何使用 Joda-Time 函式庫來實現相同的目標。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。