我正尝试使用"20/08/18 13:21:00:428"
类和格式DateFormat
来解析字符串"dd/MM/yy' 'HH:mm:ss:SSS"
。时区设置为BST。
上述返回的日期是正确的,但是时间以小时数08
而不是13
-"Mon Aug 20 08:21:00 BST 2018"
以下代码段显示了刚才提到的日期和时间:
String toBeParsed = "20/08/18 13:21:00:428";
DateFormat format = new SimpleDateFormat("dd/MM/yy' 'HH:mm:ss:SSS");
format.setTimeZone(TimeZone.getTimeZone("BST"));
Date parsedDate = format.parse(toBeParsed);
System.out.println(parsedDate);
这与我的时区有关还是我误解了这种模式?
答案 0 :(得分:4)
BST是孟加拉国标准时间。如果要自动设置夏令时,则使用的正确时区是“欧洲/伦敦”,如果要一直设置英国夏令时,则要使用“ UTC + 1”。
请参见https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#SHORT_IDS
答案 1 :(得分:1)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uu H:mm:ss:SSS");
String toBeParsed = "20/08/18 13:21:00:428";
ZonedDateTime dateTime = LocalDateTime.parse(toBeParsed, formatter)
.atZone(ZoneId.of("Europe/London"));
System.out.println(dateTime);
此代码段的输出为:
2018-08-20T13:21:00.428 + 01:00 [欧洲/伦敦]
尽管我总是建议不要对那些过时且设计不佳的类Date
,TimeZone
和DateFormat
进行建议,但在这种情况下,它们的表现尤其令人困惑。如果日期位于一年中的夏季时间,则在以欧洲/伦敦为默认时区的JVM上打印Date
时区为BST
。
TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
Date oldFashionedDate = new Date();
System.out.println(oldFashionedDate);
2018年8月20日星期一15:45:39 BST
但是,当我将时区设置为BST时,孟加拉国的时间可以理解,但是它带有非标准缩写BDT:
TimeZone.setDefault(TimeZone.getTimeZone("BST"));
System.out.println(oldFashionedDate);
2018年8月20日星期一20:45:39 BDT
(我已经在Java 8和Java 10上观察到了这种行为。)
要学习的另一课是永远不要依靠三个字母和四个字母的时区缩写。它们是模棱两可的,不是标准化的。
PS感谢DodgyCodeException发现了时区缩写解释问题。