我想使用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”替换,所以我不想忽略它。
答案 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`
此解决方法的好处:不打扰“哪个版本适用于此时区???”