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#appendTimeZoneShortName
将CEST
添加为“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`
这种解决方法的好处:不打扰“哪个版本适用于这个时区???”