作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
昨天我遇到了一个问题,一个人的出生日期在用 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”是阿姆斯特丹位置的无效日期?
如果这是一个错误,应该在哪里报告?如果日期输入本身是无效的,parse 方法不应该抛出错误吗?
最佳答案
看起来德国在 1933 年没有进行 CET 到 CEST 的转换,而荷兰则进行了:
关于java - 阿姆斯特丹时区的 SimpleDateFormat 行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7770730/
我是一名优秀的程序员,十分优秀!