【问题标题】:Joda DateTime: Parse date with "CEST" in stringJoda DateTime:用字符串中的“CEST”解析日期
【发布时间】:2013-04-22 19:24:44
【问题描述】:

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

【问题讨论】:

    标签: java scala datetime jodatime


    【解决方案1】:

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

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

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

    【讨论】:

    • 由于“2012-08-28 15:35:00 PDT”正在工作,我想我已经有了新版本。不过,在提交中没有看到任何提及“CEST”或“CET”。有没有办法解析它?
    • @Heinzi 我假设您使用的是 joda-time-2.1,但尚未包含此逻辑。请注意,使用 2.1 PDT 将不起作用。请参阅我的更新答案以了解解决方法。
    【解决方案2】:

    使用java.util.Dateinstance 应用解析允许您应用解决方法,因为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`
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      相关资源
      最近更新 更多