Java ZonedDateTime.parse 未按预期工作

问题描述 投票:0回答:1

我正在使用 Java 17。我试图将不同的字符串解析为 ZonedDateTime,但是当我尝试将其转换为 Instant 时,输出不符合预期。例如:

        String first = "2020-01-08T21:00:00Z[Europe/Berlin]";
        ZonedDateTime zone1 = ZonedDateTime.parse(first);
        String second = "2020-01-08T20:00:00Z[UTC]";
        ZonedDateTime zone2 = ZonedDateTime.parse(second);
        System.out.println(zone1.toInstant());
        System.out.println(zone2.toInstant());

输出是(这是错误的,两次应该相同):

2020-01-08T21:00:00Z
2020-01-08T20:00:00Z

但是,当我使用构造函数和 ZoneId 创建 ZonedDateTime 对象时,我得到了正确的输出:

        ZonedDateTime z1 = ZonedDateTime.of(2020,1,8,21,0,0,0,ZoneId.of("Europe/Berlin"));
        System.out.println(z1.toInstant());
        
        ZonedDateTime z2 = ZonedDateTime.of(2020,1,8,20,0,0,0,ZoneId.of("UTC"));
        System.out.println(z2.toInstant());

输出:

2020-01-08T20:00:00Z
2020-01-08T20:00:00Z

谁能告诉我为什么我的解析方法没有按预期工作?

注意:此问题与 JDK8 中 ZonedTimeZone 的 DST bug 无关:

java timezone java-17 datetime-parsing zoneddatetime
1个回答
3
投票

在输入字符串

"2020-01-08T21:00:00Z[Europe/Berlin]"
(和第二个)中删除“Z”,因为这意味着它是 UTC 时间,后续时区将被忽略。因此,您的两个时间均采用 UTC 时间,这意味着第一个时间不在
[Europe/Berlin]
时区。您可能想使用
DateTimeFormatter
类使用格式掩码来解析字符串。或者将“Z”替换为“+01:00”,然后就不需要使用格式了。

© www.soinside.com 2019 - 2024. All rights reserved.