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
链接
这不是另一个时区问题的重复,因为我没有选择时区格式的奢侈。我正在迁移我的 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
链接