Java SimpleDateFormat解析不规范

标签 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 ('太平洋夏令时间')" 或格式 "EEE MMM dd yyyy HH:mm:ss '-0700' ( zzzz)" 结果是正确的日期:

Sun Aug 11 13:00:00 CDT 2013

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

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

最佳答案

过去,Java 在处理夏令时和时区方面肯定存在错误,这看起来确实像您所发现的那样。这是什么版本的 Java?

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

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

关于Java SimpleDateFormat解析不规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18645324/

相关文章:

java - 重绘仅在调整大小后有效

java 日历时区 奇怪的东西

java 用皮秒解析日期

python - 如何将字符串转换为日期时间?

java - DateTimeFormatterBuilder#appendText(TemporalField, Map<Long,String>) 解析时抛出异常

java - 过载 Lombok setter

java - 不幸的是,MyApp 已停止。我该如何解决这个问题?

java - Mac OS X Activator New Play Framework 错误

java - Joda 时区与地区/城市解析

javascript - 使用 Moment.js 格式化日期