2 回答

TA貢獻1798條經驗 獲得超7個贊
LocalDateTime從ZonedDateTime時區的簡單切割中獲取。它的價值無關緊要。您需要做的是將您的ZonedDateTime區域從+8 區轉換為+2 區,這將相應地改變時間。然后就可以LocalDateTime從你的修改中ZonedDateTime得到想要的效果了。這是一個演示它的示例:
private static void testDateParsing() {
ZonedDateTime zdt = ZonedDateTime.parse("2019-08-28T10:39:57+08:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZZZZZ"));
ZonedDateTime modifiedZdt = zdt.withZoneSameInstant(ZoneId.systemDefault());
System.out.println(zdt);
System.out.println(modifiedZdt);
System.out.println(LocalDateTime.from(zdt));
System.out.println(LocalDateTime.from(modifiedZdt));
}
輸出是:
2019-08-28T10:39:57+08:00
2019-08-28T05:39:57+03:00[Asia/Jerusalem]
2019-08-28T10:39:57
2019-08-28T05:39:57
請注意,我的本地時區是+03,而不是您的+02。

TA貢獻1785條經驗 獲得超8個贊
? ? String text = "2019-08-28T10:39:57+02:00";
? ? OffsetDateTime time = OffsetDateTime.parse(text);
? ? System.out.println("Hour of day is " + time.getHour());
輸出是(如您所料):
一天中的小時是 10
嘗試不同的偏移量:
? ? String text = "2019-08-28T10:39:57+08:00";
一天中的小時是 10
所以仍然相同,仍然是字符串中給出的小時。這就是 10 的由來。我從你的代碼中選擇了一個稍微簡單的代碼示例,但它演示的行為與你的代碼相同,沒有區別,也足以解釋。
需要注意的一點是,代碼不依賴于 JVM 的時區設置(您報告為歐洲/巴黎)。那挺好的。這意味著,如果我們相信代碼是正確的,我們也可以相信它能夠在所有時區的所有 JVM 上正確運行。
LocalDateTime在您的代碼中,您通過調用轉換為toLocalDateTime(). 通常這種轉換沒有任何充分的理由,因為OffsetDateTime或ZonedDateTime很好地實現了目的。OffsetDateTime轉換的作用是保留或中的日期和時間(掛鐘時間)ZonedDateTime并丟棄偏移量或時區信息。因此,如果一天中的小時在轉換前為 10,則轉換后也將為 10。如果您期望轉換為當地時間(歐洲/巴黎),您可能會感到困惑。不執行此類轉換。Local在 java.time 名稱中意味著:沒有時區或偏移量。有人認為該詞的使用Local因為這個含義具有誤導性(從某種意義上說,它是歷史性的,因為它是從 java.time 的先驅 Joda-Time 接管的)。
那么解析 RFC 3339 字符串(表示嵌入偏移中的瞬間)并將其轉換為 LocalDateTime可能的區域調整對象的正確方法是什么?假設機器在 CE[S]T 時區運行。
解析已經可以正確地為您工作。您可能不需要轉換??梢灾苯颖容^。和的和方法在isBefore比較時會考慮不同的偏移量或時區,并將為您提供所需的結果。如果您確實想轉換:isEqualisAfterOffsetDateTimeZonedDateTime
? ? String text = "2019-08-28T10:39:57+08:00";
? ? OffsetDateTime time = OffsetDateTime.parse(text);
? ? System.out.println("Hour of day is " + time.getHour());
? ? ZoneId myTimeZone = ZoneId.of("Europe/Paris");
? ? ZonedDateTime timeInFrance = time.atZoneSameInstant(myTimeZone);
? ? System.out.println("Hour of day in France is " + timeInFrance.getHour());
Hour of day is 10
Hour of day in France is 4
同樣,您可以轉換為LocalDateTime并保留 4 點,但我不明白您為什么應該這樣做。
關于我對代碼的簡化:您的 RFC 3339 字符串包含與 UTC (+02:00) 的偏移量,而不是時區(如歐洲/巴黎或歐洲/羅馬)。所以用ZonedDateTime它來解析就有點矯枉過正了;OffsetDateTime是一個更好的選擇。字符串格式符合 ISO 8601。java.time 類可以直接解析最常見的 ISO 8601 格式變體,無需任何顯式格式化程序,因此我們在這里不需要格式化程序。順便說一句,您分配給格式化程序的區域沒有任何區別,因為使用了字符串中的偏移量。
添加回答
舉報