將 Google Protocol Buffer 時間戳記轉換為 LocalDate
1. 概述
協定緩衝區(protobuf)資料格式幫助我們透過網路傳輸結構化資料。它獨立於任何程式語言,並且具有大多數程式語言(包括 Java)的實作。
protobuf Timestamp
類型表示時間點,獨立於任何特定時區。時間是運算中至關重要的組成部分,在某些情況下,我們可能需要將 protobuf Timestamp
轉換為 Java 時間實例(例如LocalDate,
以將其無縫整合到現有的 Java 程式碼庫中。
在本教程中,我們將探索將 protobuf Timestamp 實例轉換為LocalDate
類型的過程,使我們能夠在 Java 應用程式中更有效地使用 protobuf 資料。
2.Maven依賴
要建立Timestamp
實例或使用從.proto
檔案產生的程式碼,我們需要將protobuf-java
依賴項新增至pom.xml
:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>4.26.1</version>
</dependency>
此依賴項提供了Timestamp
類別和其他與 protobuf 相關的類別。
3. Timestamp
類
protobuf Timestamp
類別表示自 Unix 紀元以來的時間點。時區或當地日曆不會影響它。
它表示為某個時間點的秒數和奈秒數。讓我們來看一個使用 Java Instant
物件計算當前Timestamp
的範例:
Instant currentTimestamp = Instant.now();
Timestamp timestamp = Timestamp.newBuilder()
.setSeconds(currentTimestamp.getEpochSecond())
.setNanos(currentTimestamp.getNano())
.build();
在上面的程式碼中,我們從Instant
物件計算Timestamp
。首先,我們建立一個Instant
對象,它表示給定點的日期和時間。接下來,我們提取秒和奈秒並將它們傳遞給Timestamp
實例。
4. 將Timestamp
實例轉換為LocalDate
從Timestamp
轉換為LocalDate
時,考慮時區及其與 UTC 的相關偏移以準確表示本地日期至關重要。要將Timestamp
轉換為LocalDate
,我們先建立一個具有特定秒數和奈秒集的Timestamp
實例:
Timestamp ts = Timestamp.newBuilder()
.setSeconds(1000000)
.setNanos(77886600)
.build();
由於Instant
類別是時間點最適合的表示形式,因此我們建立一個接受Timestamp
作為參數並將其轉換為LocalDate
方法:
LocalDate convertToLocalDate(Timestamp timestamp) {
Instant instant = Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos());
LocalDate time = instant.atZone(ZoneId.of("America/Montreal")).toLocalDate();
return time;
}
在上面的程式碼中,我們使用ofEpochSecond()
方法從Timestamp
建立一個Instant
對象,該方法將Timestamp
中的秒和奈秒作為參數。
然後,我們使用atZone()
方法將Instant
物件轉換為LocalDate
,這允許我們指定時區。這很重要,因為它確保產生的 LocalDate 反映時區偏移量。
值得注意的是,我們也可以使用預設的系統時區:
LocalDate time = instant.atZone(ZoneId.systemDefault()).toLocalDate();
讓我們寫一個單元測試來斷言邏輯:
@Test
void givenTimestamp_whenConvertedToLocalDate_thenSuccess() {
Timestamp timestamp = Timestamp.newBuilder()
.setSeconds(1000000000)
.setNanos(778866000)
.build();
LocalDate time = TimestampToLocalDate.convertToLocalDate(timestamp);
assertEquals(LocalDate.of(2001, 9, 9), time);
}
在上面的程式碼中,我們斷言轉換中的LocalDate
與預期結果相符。
5. 結論
在本教程中,我們學習如何透過轉換為Instant
來表示時間點,從而將Timestamp
轉換為LocalDate
。此外,我們透過設定時區將Instance
物件轉換為LocalDate
類型以處理可能的偏移。
與往常一樣,該範例的完整原始程式碼可在 GitHub 上取得。