Java SimpleDateFormat解析不规则性

时间:2013-09-05 20:27:37

标签: java date-parsing

我正在用Java解析日期并遇到一些奇怪的行为。

我有一个日期字符串,如下所示:

String s = "Sun Aug 11 2013 11:00:00 -0700 (Pacific Daylight Time)"

我正在尝试将其解析为日期对象,如下所示:

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss Z (zzzz)");

然后我从sdf.parse(s)打印出结果日期对象并获取:

Sun Aug 11 12:00:00 CDT 2013

我在中央时区,所以它打印它是有意义的,但是,CDT是-0500,因此解析日期应该是13:00,而不是12:00。

奇怪的是,如果我删除任何冗余的时区信息,日期就会正确解析。使用格式"EEE MMM dd yyyy HH:mm:ss Z ('Pacific Daylight Time')"或格式"EEE MMM dd yyyy HH:mm:ss '-0700' (zzzz)"会产生正确的日期:

Sun Aug 11 13:00:00 CDT 2013

此行为似乎仅发生在夏令时内的日期。如果我用12月初的日期格式解析日期,我会得到正确的结果。

我对我正在解析的日期格式的控制有限,而且它们可能来自各个时区。有没有人遇到过这种行为,有没有办法绕过它而不改变日期字符串的格式?我意识到时区指定是多余的,但据我所知,它们并不是错误的。

1 个答案:

答案 0 :(得分:0)

过去,Java在处理夏令时和时区时肯定存在漏洞,这看起来确实像你找到的那样。这是什么版本的Java?

您可能想尝试Joda-Time试一试,看看它是否正确处理了给定日期。

如果Joda没有帮助,您可能需要尝试预解析某些日期字符串以删除括号中的描述性时区,因为它只在定义了一个时起作用。确实很奇怪!