Java8 时间库没有正确解释 BST 时区

Java8 time library does not interpret BST timezone correctly

这不是另一个时区问题的重复,因为我没有选择时区格式的奢侈。我正在迁移我的 java 代码以使用新的 java8 时间库,但我发现 DateTimeFormatter 没有正确解释时区 "BST"(英国夏令时) .它没有将其设为 UTC+0100,而是将其转换为 Pacific/Bougainville 时区。任何人都知道我如何在不返回旧的 SimpleDateFormat 的情况下解决这个问题,或者使用明确设置的时区,因为我的代码需要在世界多个地区 运行?这个时间戳格式是通过查询其他系统获得的,所以我将无法更改它。 SimpleDateFormat 似乎可以正确识别时区。我的测试代码如下:

public static void main(String[] args) throws ParseException {
    String sTime = "Fri Jun 07 14:07:07 BST 2019";
    DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE MMM dd kk:mm:ss z yyyy");
    ZonedDateTime zd = ZonedDateTime.parse(sTime, FORMATTER);
    System.out.println("The time zone: " + zd.getZone());
    FileTime ftReturn = FileTime.from(zd.toEpochSecond(), TimeUnit.SECONDS);
    System.out.println("File time is: " + ftReturn);

    DateFormat df = new SimpleDateFormat("EEE MMM dd kk:mm:ss z yyyy", Locale.ENGLISH);
    Date dtDD = df.parse(sTime);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dtDD);
    FileTime ftReturn1 = FileTime.fromMillis(calendar.getTimeInMillis());
    System.out.println("File time1 is:  " + ftReturn1);
}

测试结果:
时区:Pacific/Bougainville
文件时间为:2019-06-07T03:07:07Z
文件时间1为:2019-06-07T13:07:07Z

根据https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#SHORT_IDS

BST - Asia/Dhaka

所以我猜你不应该使用那个缩写。

编辑:刚找到这个 ,它回答了它。

所以不要使用孟加拉国标准时间 ;) 而是使用 ZoneId.of("Europe/London")

首先,您要尝试解决无法解决的任务。三个字母的时区缩写是模棱两可的,我认为经常如此。因此,如果您解决了 Europe/London 的问题,当您遇到 EST、IST、CST、CDT、PST、WST 等等时,您将再次遇到它。或者当您遇到一个字符串,其中 BST 的意思是巴西夏令时、孟加拉国标准时间或布干维尔标准时间。还有更多的解释存在。取而代之的是获得一个明确的字符串,例如带有 UTC 偏移量而不是时区缩写的字符串,最好是 ISO 8601 格式的字符串,例如 2019-06-07T14:07:07+01:00.

但如果您确定 BST 在您的世界中始终表示英国夏令时,short-sighted 解决方案可能是告诉 DateTimeFormatter 您更喜欢哪个时间 zone/s:

    String sTime = "Fri Jun 07 14:07:07 BST 2019";
    ZoneId preferredZone = ZoneId.of("Europe/London");
    DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
            .appendPattern("EEE MMM dd HH:mm:ss ")
            .appendZoneText(TextStyle.SHORT, Collections.singleton(preferredZone))
            .appendPattern(" yyyy")
            .toFormatter(Locale.ROOT);
    ZonedDateTime zd = ZonedDateTime.parse(sTime, FORMATTER);
    System.out.println("The time zone: " + zd.getZone());
    FileTime ftReturn = FileTime.from(zd.toEpochSecond(), TimeUnit.SECONDS);
    System.out.println("File time is: " + ftReturn);

输出为:

The time zone: Europe/London
File time is: 2019-06-07T13:07:07Z

链接