2016-03-18 3 views
5

Я хочу, чтобы разобрать LocalDateTime из следующего рисунка:LocalDateTime.parse() с рисунком только номера

yyyyMMddHHmmss000000 

Это означает, что обычный «гггг ... сс», а затем шесть завершающие нули.

Так, форматирование работает отлично:

String p = "yyyyMMddHHmmss'000000'"; 
LocalDateTime.now().format(DateTimeFormatter.ofPattern(p)); 

и, кроме парсинга:

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 

за исключением:

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) 
... 

Я не могу изменить формат входного значения. Как я могу разобрать его правильно? Является ли мой шаблон неправильным?

Java Версия: 1.8.0_60 на OSX

+1

Для полноты, ошибка: https://bugs.openjdk.java.net/browse/JDK-8031085 – Marcel

ответ

7

Это выглядит, как будто это ошибка с 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(); 

Разница заключается в том, что она вынуждает ширину поля для разбора с appendValue(field, width).

Эта ошибка похожа на ту, что упоминается in another answer of mine, хотя упоминается миллисекунды вместо буквенных символов в шаблоне.

+1

Единственный недостаток - вы представляете проблему Y10K :) – bowmore

+2

@bowmore Исправлено: D Давайте надеюсь, что ошибка будет решена к тому времени :). – Tunaki