如何使用joda解析24小时的日期?

时间:2015-02-05 09:34:21

标签: java datetime jodatime

如何告诉joda-time自动检测24小时字符串并相应地解析它们?

DateTimeFormat.forPattern("YYYYMMDDhhmm").parseDateTime("201410171500");

结果:

org.joda.time.IllegalFieldValueException: Cannot parse "201410171500": Value 50 for clockhourOfHalfday must be in the range [1,12]
    at org.joda.time.field.FieldUtils.verifyValueBounds(FieldUtils.java:234)
    at org.joda.time.field.ZeroIsMaxDateTimeField.set(ZeroIsMaxDateTimeField.java:86)
    at org.joda.time.format.DateTimeParserBucket$SavedField.set(DateTimeParserBucket.java:568)
    at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:447)
    at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:411)
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:882)

顺便说一下,这很奇怪:以下工作没有错误:

DateTimeFormat.forPattern("YYYYMMDDHH").parseDateTime("2014101715");

3 个答案:

答案 0 :(得分:5)

您需要非常仔细地阅读documentation for pattern characters

  • 您需要yyyy而不是YYYY,因为您需要常规日历年而不是年代。 (在Joda Time中可能不太重要,但是如果您将代码移植到SimpleDateFormatYYYY将意味着周年,这是您真正不想要的。)
  • 24小时制你需要HH而不是hh
  • 您希望dd而不是DD的某一天(您不希望每年的某一天)

所以:

DateTimeFormat.forPattern("yyyyMMddHHmm").parseDateTime("201410171500");

答案 1 :(得分:2)

模式区分大小写:

大写字母D是日期,可以有3位数,小写字母“h”是12小时。

所以你必须将你的模式改为:

DateTimeFormat.forPattern("yyyyMMddHHmm").parseDateTime("201410171500");

来自documentaion

  

第189天的D日

     

每月第10天的日期

     半天(1~12)12号时钟

     

一天中的H小时(0~23)数字0

答案 2 :(得分:0)

请使用

DateTimeFormat.forPattern("YYYYMMDDHHmm")

因为h - >半天的时钟(1~12)

参考 - http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html