DateFormat返回错误的小时

时间:2018-08-20 12:44:50

标签: java time hour datetime-parsing

我正尝试使用"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);

这与我的时区有关还是我误解了这种模式?

2 个答案:

答案 0 :(得分:4)

BST是孟加拉国标准时间。如果要自动设置夏令时,则使用的正确时区是“欧洲/伦敦”,如果要一直设置英国夏令时,则要使用“ UTC + 1”。

请参见https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#SHORT_IDS

答案 1 :(得分:1)

java.time

    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 [欧洲/伦敦]

您的代码出了什么问题?

尽管我总是建议不要对那些过时且设计不佳的类DateTimeZoneDateFormat进行建议,但在这种情况下,它们的表现尤其令人困惑。如果日期位于一年中的夏季时间,则在以欧洲/伦敦为默认时区的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上观察到了这种行为。)

要学习的另一课是永远不要依靠三个字母和四个字母的时区缩写。它们是模棱两可的,不是标准化的。

  • BST可能表示巴西夏季时间或巴西夏季时间,孟加拉国标准时间,布干维尔标准时间或英国夏季时间(请注意,S有时是标准时间,有时是夏天,通常与标准时间相反)。 li>
  • BDT可能表示文莱达鲁萨兰国时间或英国夏令时间(英国夏令时(BST)的别称),但我不知道孟加拉国时间有时也用这种方式缩写。

PS感谢DodgyCodeException发现了时区缩写解释问题。

链接

Time Zone Abbreviations — Worldwide List