LocalDateTime.parse()只带有模式数字

Mar*_*cel 6 java datetime parsing java-8 java-time

我想从以下模式解析LocalDateTime:

yyyyMMddHHmmss000000
Run Code Online (Sandbox Code Playgroud)

这意味着通常的"yyyy ... ss"然后是六个尾随的零.

因此,格式化工作正常:

String p = "yyyyMMddHHmmss'000000'";
LocalDateTime.now().format(DateTimeFormatter.ofPattern(p));
Run Code Online (Sandbox Code Playgroud)

然后解析:

String p, v;
p = "yyyyMMddHHmmss";                                    // without '000000'
v = "20160131235930";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyy-MMddHHmmss'000000'";                           // with '-' in between
v = "2016-0131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it works


p = "yyyyMMddHHmmss'000000'";                            // with '000000' but without '-'
v = "20160131235930000000";
LocalDateTime.parse(v, DateTimeFormatter.ofPattern(p));  // it throws Exception
Run Code Online (Sandbox Code Playgroud)

例外情况:

java.time.format.DateTimeParseException: Text '20160131235930000000' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
...
Run Code Online (Sandbox Code Playgroud)

我无法更改输入值的格式.我该如何正确解析它?我的模式错了吗?

Java版本:OSX上的1.8.0_60

Tun*_*aki 9

这看起来像是一个错误DateTimeFormatter及其对可变宽度输入的处理.

构造以下格式化程序并DateTimeFormatterBuilder解决问题

DateTimeFormatter formatter = 
        new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4)
                                      .appendValue(ChronoField.MONTH_OF_YEAR, 2)
                                      .appendValue(ChronoField.DAY_OF_MONTH, 2)
                                      .appendValue(ChronoField.HOUR_OF_DAY, 2)
                                      .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
                                      .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
                                      .appendLiteral("000000")
                                      .toFormatter();
Run Code Online (Sandbox Code Playgroud)

不同之处在于它强制字段的宽度进行解析appendValue(field, width).

这个错误听起来类似于我的另一个回答中提到的错误,尽管它提到了毫秒而不是模式中的文字字符.

  • @bowmore正确:D我们希望这个bug能够在那时解决:). (2认同)