首页 > 解决方案 > SimpleDateFormat - 时区不正确

问题描述

我在解析 Java 中的时间戳时遇到问题。

我希望两个时间戳都在同一个时区(CET)中。

    SimpleDateFormat sdaf = new SimpleDateFormat ("dd.MM.yyyy HH:mm:ss");

    String str = "30.03.2013 06:00:00";
    sdaf.setTimeZone (TimeZone.getTimeZone ("CET"));
    java.util.Date dat = sdaf.parse (str);
    System.out.println (str + " = " + dat);

    str = "31.03.2013 05:00:00";
    sdaf.setTimeZone (TimeZone.getTimeZone ("CET"));
    dat = sdaf.parse (str);
    System.out.println (str + " = " + dat);

但事实并非如此 - 请参阅输出。

30.03.2013 06:00:00 = Sat Mar 30 06:00:00 CET 2013
31.03.2013 05:00:00 = Sun Mar 31 05:00:00 CEST 2013

编辑:

如果我用 GMT+1 更改 CET,我会得到这个。

 03.2013 06:00:00 = Sat Mar 30 06:00:00 CET 2013
 31.03.2013 05:00:00 = Sun Mar 31 06:00:00 CEST 2013

似乎是正确的。但是为什么 CET 不起作用?

UTC+1 产生

30.03.2013 06:00:00 = Sat Mar 30 07:00:00 CET 2013
31.03.2013 05:00:00 = Sun Mar 31 07:00:00 CEST 2013

与 GMT+1 有何不同 - ????

标签: javadatesimpledateformat

解决方案


您无法获得31.03.2013 05:00:00CET的时区,因为它不再位于该时区。要了解,只需检查两个时区的名称

  • CET :中欧时间(UTC+1GMT+1)
  • CEST :中欧夏令时(UTC+2GMT+2)

这是 2013 年 3 月 31 日 02:00:00 期间发生的夏令时。因此,您无法获得CET第二个日期的时区,因为它位于夏季“时区”。

如果你解析31.03.2013 02:00:00你会得到

2013 年 3 月 31 日 02:00:00 = 2013 年 3 月 31 日星期日 03:00:00 CEST

因为在当天的 02:00:00,夏令时发生了,变成了 03:00:00。

您可以使用TimeZone.inDaylightTime(Date)

String str = "30.03.2013 06:00:00";
java.util.Date dat = sdaf.parse (str);
System.out.println (str + " = " + dat);
System.out.println("SDT : " + TimeZone.getTimeZone("CET").inDaylightTime(dat));

2013 年 3 月 30 日 06:00:00 = 2013 年 3 月 30 日星期六 06:00:00 CET 2013
SDT:假

str = "31.03.2013 02:00:00";
dat = sdaf.parse (str);
System.out.println (str + " = " + dat);
System.out.println("SDT : " + TimeZone.getTimeZone("CET").inDaylightTime(dat));

2013 年 3 月 31 日 02:00:00 = 2013 年 3 月 31 日星期日 03:00:00 CEST
SDT:真

由于与orCET相同并成为or ,因此当您强制日期为 on 时,您将获得等效的 the ,但不考虑 SDT 参数。UTC+1GMT+1CESTUTC+2GMT+2GMT+1CET

注意:这是大多数处理过程中LocalDateTime不打扰的原因之一。TimeZone


推荐阅读