2016-03-18 32 views
5

chcę analizować LocalDateTime z następującego wzoru:LocalDateTime.parse() wzorkiem tylko liczby

yyyyMMddHHmmss000000 

Oznacza to, że zwykłe "yyyy ... ss", a następnie sześć końcowe zera.

Więc formatowanie działa dobrze:

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

ale i analizowania:

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 

wyjątkiem:

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

nie mogę zmienić format wartości wejściowej. Jak mogę je poprawnie przeanalizować? Czy mój wzorzec jest zły?

Java wersja: 1.8.0_60 na OSX

+1

W celu uzupełnienia, błąd: https://bugs.openjdk.java.net/browse/JDK-8031085 – Marcel

Odpowiedz

7

To wygląda jak jest to błąd z DateTimeFormatter a jego obsługa zmiennej wejściowej szerokości.

Konstruowanie następujące formatujący z DateTimeFormatterBuilder rozwiązuje problem

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(); 

Różnica polega na tym, że wymusza się na szerokości pole do analizowania z appendValue(field, width).

Ten błąd brzmi podobnie do wspomnianego in another answer of mine, chociaż wspomina milisekundy zamiast literalnych znaków we wzorze.

+1

Jedynym minusem jest wprowadzenie problemu Y10K :) – bowmore

+2

@bowmore Popraw: D Let's mam nadzieję, że błąd zostanie rozwiązany do tego czasu :). – Tunaki