SimpleDateFormat for timezone Amsterdam的行为不一致

时间:2011-10-14 16:34:38

标签: java timezone simpledateformat

昨天我遇到了一个问题,一个人的出生日期在用XStream从Date编组到xml之后被更改,然后再次编组到Date。以下代码重现了XStream的奇怪行为:

System.setProperty("user.timezone", "Europe/Amsterdam");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S z");
String textIn = "1933-09-17 00:00:00.0 CET";
Date date = dateFormat.parse(textIn);
String textOut = dateFormat.format(date);

System.out.println("input : " + textIn);
System.out.println("date  : " + date);
System.out.println("output: " + textOut);

结果:

input : 1933-09-17 00:00:00.0 CET
date  : Sun Sep 17 00:19:32 CEST 1933
output: 1933-09-17 00:19:32.0 CEST

我发现它只发生在1940年以前的日期。这在某种程度上是可以解释的:在1940年的荷兰,从所谓的“Amsterdamse Tijd”(GMT + 00h19m32s)到欧洲时间(GMT)发生了变化+ 01h00m00s)。我无法解释为什么时区会改变节省时间(从CET到CEST)。

如果我将时区更改为柏林

System.setProperty("user.timezone", "Europe/Berlin");

我得到了我期望的结果:

input : 1933-09-17 00:00:00.0 CET
date  : Sun Sep 17 00:00:00 CET 1933
output: 1933-09-17 00:00:00.0 CET

我的服务器位于阿姆斯特丹。我将服务器的时区设置为柏林,以解决问题。

我的问题是:您认为这是SimpleDateFormat中的错误吗?或者代码无效,因为“1933-09-17 00:00:00.0 CET”是阿姆斯特丹的无效日期?

如果是错误,应该在何处报告? 如果日期输入本身无效,那么解析方法是否应该抛出错误?

1 个答案:

答案 0 :(得分:2)

看起来德国没有在1933年进行CET到CEST的过渡,而荷兰却做了: