2016-03-18 34 views
5

我想從以下模式解析LocalDateTime:LocalDateTime.parse()的模式只有數字

yyyyMMddHHmmss000000 

這意味着一貫的「YYYY ...... SS」和後面是6個尾隨零。

因此,格式化工作正常:

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

爲了完整起見,bug: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讓我們希望這個bug能在那時得到解決:)。 – Tunaki