2015-04-17 17 views
6

Tôi đang cố gắng di chuyển từ Joda đến Java 8's ZonedDateTime và tôi đang nhấn một bức tường với DateTimeFormatterBuilder mà tôi dường như không thể làm việc xung quanh.DateTimeFormatterBuilder tập quán trong Java 8, cụ thể tùy chọn

Tôi muốn chấp nhận bất kỳ các định dạng:

2013-09-20T07:00:33 
2013-09-20T07:00:33.123 
2013-09-20T07:00:33.123+0000 
2013-09-20T07:00:33.123Z 
2013-09-20T07:00:33.123Z+0000 
2013-09-20T07:00:33+0000 

Đây là người xây dựng hiện tại của tôi:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .parseCaseInsensitive() 
     .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) 
     .optionalStart() 
     .appendPattern(".SSS") 
     .optionalEnd() 
     .optionalStart() 
     .appendZoneId() 
     .optionalEnd() 
     .optionalStart() 
     .appendPattern("Z") 
     .optionalEnd() 
     .toFormatter(); 

Tôi có thể sai, nhưng có vẻ như phải phù hợp với mô hình tôi muốn. .. đúng?

Nếu có ai có thể chỉ ra những gì tôi có thể đã bỏ lỡ, nó sẽ được đánh giá cao. Tôi cũng không quá chắc chắn về việc sử dụng appendOffset, vì vậy sự rõ ràng về điều đó cũng được đánh giá cao nếu nó hóa ra là câu trả lời.

Edit:

Text '2013-09-20T07:00:33.061+0000' could not be parsed at index 23 

Nhìn vào xây dựng, điều này dường như phù hợp do các giai đoạn bắt buộc?

Chỉnh sửa 2:

Sau khi nhìn thấy những lời khuyên từ câu trả lời đầu tiên, tôi đã cố gắng này:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .parseCaseInsensitive() 
     .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) 
     .optionalStart() 
     .appendPattern(".SSS") 
     .optionalEnd() 
     .optionalStart() 
     .appendZoneOrOffsetId() 
     .optionalEnd() 
     .toFormatter() 

Nó tiếp tục thất bại trên chuỗi trên.

Sửa 3:

kiểm tra mới nhất dẫn đến ngoại lệ này:

java.time.format.DateTimeParseException: Text '2013-09-20T07:00:33.061+0000' could not be parsed at index 23 
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) 
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597) 
at java.time.ZonedDateTime.parse(ZonedDateTime.java:582) 
+0

"Có thể tôi đã sai, nhưng có vẻ như nó phải khớp với mẫu tôi muốn ... phải không?" Bạn đã cố gắng để phù hợp với họ trong một chương trình thử nghiệm? Chuyện gì đã xảy ra? – hexafraction

+0

@hexafraction yeah chỉ cần đặt một vài chuỗi thông qua; điều này đặc biệt gây ra vấn đề: 'Văn bản '2013-09-20T07: 00: 33.061 + 0000' không thể được phân tích cú pháp tại chỉ mục 23' – whitfin

Trả lời

11

Nó có thể là lý do mà +0000 không phải là một id khu vực, nhưng một vùng bù đắp.

các documentation cung cấp danh sách này:

Symbol  Meaning      Presentation  Examples 
    ------  -------      ------------  ------- 
     V  time-zone ID    zone-id   America/Los_Angeles; Z; -08:30 
     z  time-zone name    zone-name   Pacific Standard Time; PST 
     O  localized zone-offset  offset-O   GMT+8; GMT+08:00; UTC-08:00; 
     X  zone-offset 'Z' for zero offset-X   Z; -08; -0830; -08:30; -083015; -08:30:15; 
     x  zone-offset     offset-x   +0000; -08; -0830; -08:30; -083015; -08:30:15; 
     Z  zone-offset     offset-Z   +0000; -0800; -08:00; 

Bạn có thể sử dụng appendOffset("+HHMM", "0000") (doc) hoặc appendZoneOrOffsetId() (doc) thay vì appendZoneId().

quá trình định dạng đầy đủ của bạn có thể trông giống như sau

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
       .parseCaseInsensitive() 
       .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) 
       .optionalStart() 
       .appendPattern(".SSS") 
       .optionalEnd() 
       .optionalStart() 
       .appendZoneOrOffsetId() 
       .optionalEnd() 
       .optionalStart() 
       .appendOffset("+HHMM", "0000") 
       .optionalEnd() 
       .toFormatter(); 

Tiếp tục con đường tạo ra một ZonedDateTime có thể ảnh hưởng nếu có một ngoại lệ hay không. Do đó tôi khuyên bạn nên làm như sau vì điều này làm việc mà không có bất kỳ ngoại lệ nào.

LocalDateTime time = LocalDateTime.parse("2013-09-20T07:00:33.123+0000", formatter); 
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault()); 
+0

Có hoặc không có' appendPattern'?Chuỗi tôi còn lại trong câu hỏi vẫn còn lỗi với 'appendZoneOrOffsetId' – whitfin

+2

về cơ bản tôi muốn nói không, nhưng tôi không chắc chắn về' 2013-09-20T07: 00: 33.123Z + 0000' vì nó có thời gian cero Z và +0000 bù đắp. Theo như tôi biết về thời gian này Z và +0000 có nghĩa là như nhau. – sailingthoms

+0

ok; Tôi đã thử điều đó và nó không thành công vào '2013-09-20T07: 00: 33.061 + 0000' - tôi đã thêm các sửa đổi của tôi cho câu hỏi, trong trường hợp tôi hiểu lầm. – whitfin

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