2

我正在用 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 月,我会得到正确的结果。

我对正在解析的日期格式的控制有些有限,它们可能来自不同的时区。以前有没有人遇到过这种行为,有没有办法在不改变日期字符串格式的情况下绕过它?我意识到时区名称是多余的,但据我所知,它们并不是不正确的。

4

1 回答 1

0

过去,Java 处理夏令时和时区的过程中肯定存在一些错误,这肯定看起来像您发现的错误。这是什么版本的Java?

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

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

于 2013-09-05T20:58:17.880 回答