2016-03-18 10 views
5

ich ein Local aus folgendem Muster analysieren mag:LocalDateTime.parse() mit einem Muster nur Zahlen

yyyyMMddHHmmss000000 

Das bedeutet, den üblichen „yyyy ... ss“ und dann sechs Nullen.

So Formatierung funktioniert:

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

und aber Parsing:

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 

Die Ausnahme:

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

Ich kann nicht das Format des Eingangswertes ändern. Wie kann ich es richtig analysieren? Ist mein Muster falsch?

Java Version: 1.8.0_60 auf OSX

+1

Der Vollständigkeit halber, der Fehler: https://bugs.openjdk.java.net/browse/JDK-8031085 – Marcel

Antwort

7

Das sieht aus wie es ein Fehler mit DateTimeFormatter und dessen Umgang mit variabler Breite eingegeben wird.

Konstruieren der folgenden Formatierer mit DateTimeFormatterBuilder löst das 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(); 

Der Unterschied ist, dass es eine Breite für das Feld mit appendValue(field, width) parsen zwingt.

Dieser Fehler klingt ähnlich wie der erwähnte in another answer of mine, obwohl es Millisekunden anstelle von literalen Zeichen im Muster erwähnt.

+1

Der einzige Nachteil ist, dass Sie ein Y10K-Problem einführen :) – bowmore

+2

@bowmore Richtig: D Let's hoffe, dass der Fehler bis dahin gelöst wird :). – Tunaki

Verwandte Themen