在 Java 中檢索 Unix 時間
1. 概述
Unix 時間是自 1970 年 1 月 1 日 00:00:00 UTC 以來經過的總秒數。這個時間點被稱為 Unix 紀元。 Unix 時間有助於在程式設計中表示日期和時間。
在本教學中,我們將學習如何使用舊版 Date API、Date Time API 和 Joda-Time 函式庫在 Java 中檢索 Unix 時間值。
2. 使用舊版日期 API
Date API 提供了一個名為Date,
該類別提供了獲取當前時間的方法。我們可以將當前時間(以毫秒為單位)除以1000L
來取得當前 Unix 時間。
讓我們來看一個使用Date
類別檢索目前 Unix 時間的範例:
@Test
void givenTimeUsingDateApi_whenConvertedToUnixTime_thenMatch() {
Date date = new Date(2023 - 1900, 1, 15, 0, 0, 0);
long expected = 1676419200;
long actual = date.getTime() / 1000L;
assertEquals(expected, actual);
}
在這裡,我們建立一個新的Date
物件並使用固定的日期和時間對其進行初始化。接下來,我們對Date
物件呼叫getTime()
以取得以毫秒為單位的時間。然後,我們將時間(以毫秒為單位)除以1000L
即可得到 Unix 時間。
值得注意的是,標準 Unix 時間時間戳記的單位是自紀元以來的秒數,而不是毫秒。
最後,我們斷言結果等於預期的 Unix 時間。
3. 使用日期時間 API
Java 8 中的新日期時間 API 提供了LocalDate
和Instant
類別來操作日期和時間。我們可以透過在Instant
物件上呼叫getEpochSecond()
來取得目前的 Unix 時間:
@Test
void givenTimeUsingLocalDate_whenConvertedToUnixTime_thenMatch() {
LocalDate date = LocalDate.of(2023, Month.FEBRUARY, 15);
Instant instant = date.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant();
long expected = 1676419200;
long actual = instant.getEpochSecond();
assertEquals(expected, actual);
}
在這裡,我們建立一個LocalDate
物件來表示固定時間。接下來,我們將LocalDate
物件傳遞給Instant
物件以指示一天的開始。
此外,我們對Instant
物件呼叫getEpochSecond()
來取得指定時間的 Unix 時間值。
最後,我們斷言傳回的 Unix 時間值等於預期的 Unix 時間時間戳記。
4. 使用 Joda-Time 函式庫
Joda-Time 庫提供了一個DateTime
類別來取得當前時間。得到目前時間後,我們就可以輕鬆計算出Unix時間了。要使用 Joda Time,我們將其依賴項新增至pom.xml
:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
以下是使用 Joda-Time 庫中的DateTime
類別來檢索 Unix 時間的範例程式碼:
@Test
void givenTimeUsingJodaTime_whenConvertedToUnixTime_thenMatch() {
DateTime dateTime = new DateTime(2023, 2, 15, 00, 00, 00, 0);
long expected = 1676419200;
long actual = dateTime.getMillis() / 1000L;
assertEquals(expected, actual);
}
在上面的程式碼中,我們建立一個具有固定日期和時間的DateTime
實例,並呼叫getMillis()
方法。接下來,我們將其除以1000L
即可得到 Unix 時間時間戳記。
5. 避免 2038 年問題
通常,在許多系統和程式語言中,Unix 時間以有符號 32 位元整數儲存。但是,32 位元整數可以儲存的最大值為2 147 483 647
。
這會為 Unix 時間帶來問題,因為在 2038 年 1 月 19 日 03:14:07 UTC 時,Unix 時間值將達到其限制。接下來的幾秒鐘將變為負數,這可能會導致系統出現錯誤行為、應用程式故障、崩潰和系統故障。
我們可以透過將 Unix 時間儲存為 64 位元長整數而不是 Java 中的 32 位元整數來避免此限制。
六,結論
在本文中,我們學習如何使用舊版資料 API、日期時間 API 和 Joda-Time 函式庫來擷取 Unix 時間。以 64 位元長整數儲存 Unix 時間值可以避免未來日期的任何限製或溢出問題。
與往常一樣,範例的完整原始程式碼可 在 GitHub 上取得。