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

我想使用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"); 

不幸的是,这不起作用,但抛出exception:

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

为什么这不起作用? 当然我可以忽略“CEST”部分并解析剩下的部分,但在输入中“CEST”有时会被“CET”替换,所以我不想忽略它。

问题是因为CEST是一个不唯一的短区域名称。 请参阅DateTimeFormatter详细讨论使用US Locale中的常规时区解析Bug?

您可以使用github中应包含修复程序的最新版本,请参阅此提交 。

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

使用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` 

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