java - SimpleDateFormat - 时区不正确

标签 java date 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

编辑:

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

 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 有什么不同 - ??????

最佳答案

您无法获取 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你会得到

31.03.2013 02:00:00 = Sun Mar 31 03:00:00 CEST 2013

因为当天 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));

30.03.2013 06:00:00 = Sat Mar 30 06:00:00 CET 2013
SDT : false

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));

31.03.2013 02:00:00 = Sun Mar 31 03:00:00 CEST 2013
SDT : true

由于 CETUTC+1GMT+1 相同,并且 CEST 变为 UTC+2GMT+2,当您强制将日期设置为 GMT+1 时,您将得到与 CET 等效的值code> 但没有考虑 SDT 参数。

注意:这是 LocalDateTime 不使用 TimeZone 进行大部分处理的原因之一。

关于java - SimpleDateFormat - 时区不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289039/

相关文章:

java - JXDatePicker 使用 SimpleDateFormat 将 dd.MM.yy 格式化为当前世纪的 dd.MM.yyyy

Java快速找到距离给定二维点最近的k个点

java - 如何使用 simpledateformat 将字符串转换为日期

java - Android SimpleDateFormat 变得疯狂

java - 对如何将 ddmmyy 字符串转换为 dd-MMM-yy 日期感到困惑

java - 来自java的日期时间不同步(tomcat 7)

java - 将长转换为休假 1 分钟

java - 阻止通过spring boot应用程序中的url栏转到其他网页

java - 如何使 JTextField 在按钮单击后出现,并且只接受与另一个字符串相同长度的字符 - Java GUI

java - 如何从 WildFly 调试日志中删除 Hibernate 调试语句