2012-11-01 37 views
2

我想使用joda库解析DateTime(在scala中,但应该与java相同)。Joda DateTime:在字符串中使用“CEST”解析日期

源看起来像

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

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

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

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

+0

既然“2012-08-28 15:35:00 PDT”正在工作,我想我已经有了新版本。在提交中没有看到提及“CEST”或“CET”的提示。有没有办法解析它呢? – Heinzi

+0

@Heinzi我假设你使用了joda-time-2.1,那还没有包含这个逻辑。请注意,使用2.1“PDT”将不起作用。查看我的更新答案以获得解决方法。 – dan

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` 

这种解决方法的优点:不与“哪个版本这个时区工作的烦恼呢? ??”