【问题标题】:Joda DateTimeFormatter Exception thrown when setting the time zone: "is malformed at"Joda DateTimeFormatter 设置时区时抛出异常:“格式错误”
【发布时间】:2014-01-29 18:55:28
【问题描述】:

我正在尝试使用 Joda 库的 DateTimeFormatter 从字符串中解析 DateTime 对象。由于某种原因,它在到达要解析的时区时抛出异常。

这是我的代码:

    protected static final String DEFAULT_TIMEZONE = "America/Denver";
    // Parse the date for the note
    DateTimeFormatter dtFormatter = DateTimeFormat.forPattern("MM/dd/yyyy hh:mm a ZZZ");
    String dateStr = defaultMonth + "/15/" + defaultYear + " 12:00 am " + DateTimeZone.forID(DEFAULT_TIMEZONE);
    try {
        DateTime noteDate = dtFormatter.parseDateTime(dateStr);
    } catch(Exception e) {
        e.printStackTrace();
    }

堆栈跟踪:

java.lang.IllegalArgumentException:无效格式:“11/15/2014 12:00 am America/Denver”在“America/Denver”格式错误 在 org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:683) 在 com.happyjacksoftware.emr.actions.AddreportnotesController.create(AddreportnotesController.java:56) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597)

我实际上并没有将任何时间作为输入,所以我尝试了模式字符串"MM/dd/yyyy ZZZ",但这不起作用,我想也许 DateTime 对象需要一个时间来实例化。然而,添加时间并没有奏效。

注意:我确实尝试过使用模式字符串 "MM/dd/yyyy hh:mm a Z" 和字符串 11/15/2014 12:00 am -0700 并且它有效,但是获取数字偏移量对我来说不太方便,所以我希望有使用时区 ID 的解决方案。

【问题讨论】:

  • DateTime noteDate = dtFormatter.parseDateTime("11/15/2014 12:00 am America/Denver"); 适合我。你能尝试运行那行特定的代码吗?
  • 嗯,是的,即使尝试使用您在上面发布的“硬编码”字符串进行解析仍然会产生相同的异常消息:java.lang.IllegalArgumentException: Invalid format: "11/15/2014 12:00 am America/Denver" is malformed at "America/Denver". 我清理了服务器,认为可能 Joda 库出了问题,但它没有帮助。
  • @PopoFibo - 是的 ZZZ 表示 ZoneID
  • @JakubK 是的,只是确认 OP 保持一致。

标签: java date datetime jodatime date-formatting


【解决方案1】:

我已经在 J​​odaTime 2.1 - 2.3 上检查了您的代码,它运行正常。我认为您使用了一些可以以不同方式表现的旧版本。在当前版本的 Joda parseDateTime 方法从第 841 行开始,您的堆栈跟踪在第 683 行显示错误。时区数据库不同,这是因为您遇到了解析异常。

【讨论】:

  • Works for me 不是真正的答案,而是 cmets。如果您想问 OP 问题,也可以使用评论。答案是针对解决方案,而不是问题。
  • 答案是 - 问题是他使用的是旧版本的 JodaTime
  • 看来我使用的是 JodaTime 1.6.2。我没有意识到它太旧了......我会看看使用更新版本是否有帮助(虽然我能够在不同的项目中做到这一点而没有这个问题)
  • @rawkfist0215 您可以在此处找到有关 timezeones 数据库的更多详细信息:joda-time.sourceforge.net/tz_update.html
  • 是的,更新到最新版本确实解决了问题。感谢@JakubK 提供有用的链接,并感谢你们俩的时间。
猜你喜欢
  • 2020-08-06
  • 2013-09-20
  • 1970-01-01
  • 2011-06-18
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
相关资源
最近更新 更多