簡體   English   中英

ZonedDateTime更改行為jdk 8/11

[英]ZonedDateTime change behavior jdk 8/11

我正在將應用程序從jdk 8遷移到11,我可以看到ZonedDateTime更改是關於夏時制的行為。 JDK8

        ZonedDateTime parse = ZonedDateTime.parse("2037-05-10T19:15:00.000+01:00[Europe/Paris]");
        System.out.println(parse);

輸出:2037-05-10T19:15 + 02:00 [Europe / Paris]

JDK11 / 12

        ZonedDateTime parse = ZonedDateTime.parse("2037-05-10T19:15:00.000+01:00[Europe/Paris]");
        System.out.println(parse);

2037-05-10T20:15 + 02:00 [歐洲/巴黎]

有人可以向我解釋為什么他們會改變這種行為嗎?

最好的祝福,

這是Java 8中的一個已知錯誤:JDK-8066982

我相信您在Java 8中遇到的實際上是此bug: ZonedDateTime.parse()在DST下降過渡周圍返回錯誤的ZoneOffset 錯誤標題並不能說明全部問題。 真正的問題在於,如果解析的字符串中包含時區ID,則在Java 8中, DateTimeFormatter.ISO_ZONED_DATE_TIME (由您使用的一個參數的ZonedDateTime.parse隱式使用)會忽略偏移量。 結合時區數據庫,該時區數據庫與您的關於字符串在2037年10月巴黎使用的偏移量不同的字符串相結合,將導致解析時間與字符串中的偏移量沖突。

該錯誤已在Java 9中修復。因此,在Java 9、10和11中,由於仍然存在有關offset的相同分歧,因此,分析的時刻基於字符串的offset。 然后使用時區數據庫中的規則將其從字符串轉換為時區。 這將使偏移量從+01:00更改為+02:00,並且將一天中的時間從19:15更改為20:15。 我同意Java 9+,這是正確的行為。

不要將ZonedDateTime用於將來的日期

您的問題也部分是由將來使用ZonedDateTime引起的。 僅在不久的將來我們建議這樣做,因為我們假設不會更改區域規則。 對於2037年的日期和時間,如果您知道時刻,則應該使用Instant如果您只知道日期和時間,則應該使用LocalDateTime 僅在時間臨近時並且您相信Java安裝已更新了最近的時區時,才轉換為ZonedDateTime

正如評論中所討論的那樣,我們可能尚不知道2037年10月巴黎的正確UTC偏移量。 歐盟似乎有可能從2021年開始放棄夏令時(DST),據我所知,法國政客尚未決定此后的法國時間。

如果我們想從字符串中獲取一天中的時間怎么辦?

要從字符串(19:15)中獲取時間,請解析為LocalDateTime

    String zdtString = "2037-05-10T19:15:00.000+01:00[Europe/Paris]";
    LocalDateTime dateTime
            = LocalDateTime.parse(zdtString, DateTimeFormatter.ISO_ZONED_DATE_TIME);
    System.out.println("Date and time from string: " + dateTime);

輸出為(在Java 11上運行):

字符串中的日期和時間:2037-05-10T19:15

如果您希望在更高的Java版本上擁有完整的Java 8行為-如我所提到的,不建議這樣做,則不應在此處使用ZonedDateTime

    TemporalAccessor parsed = DateTimeFormatter.ISO_ZONED_DATE_TIME.parse(zdtString);
    LocalDateTime dateTime = LocalDateTime.from(parsed);
    ZoneId zone = ZoneId.from(parsed);
    ZonedDateTime java8Zdt = dateTime.atZone(zone);
    System.out.println("Time from string in zone from string: " + java8Zdt);

字符串中的字符串所在區域中的時間:2037-05-10T19:15 + 02:00 [歐洲/巴黎]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM