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

How to parse a date with 24h time using joda?

如何让 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");

模式区分大小写:

大写 D 是星期几,可以有 3 位数字,小写 "h" 是 12 小时。

因此您必须将模式更改为:

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

来自documentaion

D day of year number 189

d day of month number 10

h clockhour of halfday (1~12) number 12

H hour of day (0~23) number 0

请使用

DateTimeFormat.forPattern("YYYYMMDDHHmm")

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

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

您需要仔细阅读documentation for pattern characters

  • 您想要 yyyy 而不是 YYYY,因为您想要常规日历年而不是纪元年。 (在 Joda Time 中不太可能很重要,但如果你移植代码以使用 SimpleDateFormatYYYY 将意味着周年,你真的不想要。)
  • 你想要 HH 而不是 hh 作为 24 小时制
  • 您想要 dd 而不是 DD 作为月中的某天(您不需要年中的某天)

所以:

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