时区BST偏移错误。

3

无法理解为什么以下代码中BST(UTC偏移量:UTC +1)的偏移量是+11,而不是我预期的+1。

final String lastUpdated = "Mon Sep 27 18:29:00 BST 2021";
final DateTimeFormatter LAST_UPDATED_FORMATTER = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z y").withLocale(Locale.UK);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(lastUpdated, LAST_UPDATED_FORMATTER);
LocalDateTime localDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();
System.out.println(zonedDateTime.getOffset()); // +11:00; expected +1
System.out.println(localDateTime.toString());

控制台输出:

+11:00
2021-09-27T07:29

一旦日期转换为 UTC 时间,所有事情就变得清晰明了:

final String lastUpdated = "Mon Sep 27 18:29:00 BST 2021";

1
你可以添加一行代码 System.out.println(zonedDateTime.getZone().toString());,执行代码并观察输出。提示:在这种情况下,“BST”不会被解释为英国夏令时! - deHaar
1个回答

9

很遗憾,您使用歧义缩写就会出现这种情况。BST可以有不同的含义,如此处所示。

看起来在这种情况下,它被解释为布干维尔标准时间(Bougainville Standard Time),即UTC+11。

即使在英国境内,BST也并非总是指英国夏令时。在1968年至1971年间,BST的意思是“英国标准时间”,尽管当时仍然是GMT+1。

对于格式化而言,使用缩写是“有点可以接受的”,但应尽可能避免在解析数据时使用缩写。如果您收到的数据中已知将使用它,并且您知道它应该表示什么,最好在解析之前替换文本中的缩写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接