2016-03-18 27 views
5

Tôi muốn phân tích một LocalDateTime từ mô hình sau:LocalDateTime.parse() với một mô hình chỉ số

yyyyMMddHHmmss000000 

đó có nghĩa là bình thường "yyyy ... ss" và sau đó sáu số không đuôi.

Vì vậy, định dạng hoạt động tốt:

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

và nhưng phân tích cú phá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 

Các Ngoại lệ:

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

tôi không thể thay đổi định dạng của các giá trị đầu vào. Làm cách nào tôi có thể phân tích cú pháp chính xác? Mẫu của tôi có sai không?

Version Java: 1.8.0_60 trên OSX

+1

Vì mục đích hoàn chỉnh, lỗi: https://bugs.openjdk.java.net/browse/JDK-8031085 – Marcel

Trả lời

7

này có vẻ như nó là một lỗi với DateTimeFormatter và xử lý của đầu vào biến rộng.

Xây dựng các định dạng sau đây với DateTimeFormatterBuilder giải quyết vấn đề

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

Sự khác biệt là nó buộc một chiều rộng cho lĩnh vực này để phân tích với appendValue(field, width).

Lỗi này có vẻ tương tự như lỗi được đề cập in another answer of mine mặc dù nó đề cập đến mili giây thay vì các ký tự chữ trong mẫu.

+1

Nhược điểm duy nhất là bạn đang giới thiệu một vấn đề Y10K :) – bowmore

+2

@bowmore Đúng: D Hãy hy vọng rằng lỗi sẽ được giải quyết sau đó :). – Tunaki

Các vấn đề liên quan