Joda DateTime:用字符串中的“CEST”解析日期

时间:2012-11-01 17:01:19

标签: java scala datetime jodatime

我想使用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”替换,所以我不想忽略它。

2 个答案:

答案 0 :(得分:4)

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

中的详细讨论

您可以使用github中应包含修补程序的最新版本,请参阅this commit

您应该可以使用DateTimeFormatterBuilder#appendTimeZoneShortName添加CEST作为“America / Chicago”的别名,或者您希望如何解释CEST

答案 1 :(得分: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`

此解决方法的好处:不打扰“哪个版本适用于此时区???”