我在用 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:00 的 CET
时区,因为它不再位于该时区。要理解,只需检查两个时区的名称即可
- CET:中欧时间(
UTC+1
或GMT+1
) - CEST:中欧夏令时(
UTC+2
或GMT+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
由于 CET
与 UTC+1
或 GMT+1
相同,并且 CEST
变为 UTC+2
或 GMT+2
,当您强制将日期设置为 GMT+1
时,您将得到与 CET
等效的值code> 但没有考虑 SDT 参数。
注意:这是 LocalDateTime
不使用 TimeZone
进行大部分处理的原因之一。
关于java - SimpleDateFormat - 时区不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289039/