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