3

我想使用 joda 库解析 DateTime(在 scala 中,但应该与 java 相同)。

来源看起来像

val dateParser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z")
val date = dateParser.parseDateTime("2012-08-28 15:35:00 CEST")

在 Java 中,这看起来像

DateTimeFormatter dateParser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z");
DateTime date = dateParser.parseDateTime("2012-08-28 15:35:00 CEST");

不幸的是,这不起作用,但会引发异常:

java.lang.IllegalArgumentException: Invalid format: "2012-08-28 15:35:00 CEST" is malformed at "CEST"

为什么这不起作用?当然我可以忽略“CEST”部分而只解析其余部分,但是在输入中“CEST”有时可以被“CET”替换,所以我不想忽略它。

4

2 回答 2

5

问题是因为CEST是一个不唯一的短区域名称。请参阅DateTimeFormatter Bug parsing with general time zone in US Locale 中的详细讨论?

您可以使用来自github的最新版本,该版本应该包含一个修复程序,请参阅此提交

您应该能够使用DateTimeFormatterBuilder#appendTimeZoneShortName添加CEST为“America/Chicago”的别名或您希望如何解释CEST的 .

于 2012-11-01T17:15:42.127 回答
1

使用实例应用解析java.util.Date允许您应用解决方法,因为CEST解析不好,因为不是唯一的:

DateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
DateTime dateTime = new DateTime(dateParser.parse("2012-08-28 15:35:00 CEST"));
//Here parsed `java.util.Date` instance is back to an instance of org.jodatime.DateTime`

这种解决方法的好处:不用担心“哪个版本适用于这个时区???”

于 2012-11-01T17:14:07.203 回答