2017-11-02 56 views
5

tôi đang cố gắng phân tích cú pháp ZonedDateTime s từ Strings theo định dạng sau:Pattern "YYYY-MM-dd HH: mm: ss Z" gây phân tích ngoại lệ nơi Jodatime không

2017-08-10 16:48:37 -0500

tôi đã làm trước đây rất thành công khi sử dụng số DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss Z") của Jodatime.

Tôi đang cố gắng thay thế Jodatime bằng API thời gian Java và cùng một mẫu không còn hoạt động nữa.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss Z"); 
ZonedDateTime.parse("2017-08-10 16:48:37 -0500", dtf); 

kết quả trong ngoại lệ sau đây:

java.time.format.DateTimeParseException: Text '2017-08-10 16:48:37 -0500' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {DayOfMonth=10, OffsetSeconds=-18000, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, MonthOfYear=8},ISO resolved to 16:48:37 of type java.time.format.Parsed 

mô hình thích hợp để sử dụng cho các chuỗi định dạng trong API Java Thời gian là gì?

Trả lời

6

Bạn nên thay thế một phần của bạn YYYY với uuuu

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss Z"); 
    ZonedDateTime parsed = ZonedDateTime.parse("2017-08-10 16:48:37 -0500", dtf); 
+2

Thú vị, những gì chính xác là sự khác biệt giữa 'year' (YYYY) và' năm-of-era' (uuuu)? –

+0

Tôi không thể giải thích tốt cho bản thân mình. Nhưng hãy chú ý rằng: * u năm * y năm-of-kỷ nguyên * Y theo tuần dựa trên năm https://docs.oracle.com/javase/8/docs/api/java/time/format/ DateTimeFormatter.html –

+2

** y ** = năm, ** Y ** = năm trong tuần. Nếu người dùng sử dụng số ** tuần ** (1-53) nửa tuần đầu tiên của năm 2017 có thể là 52 trong khi năm ** ** của nó sẽ là năm trước 2016. –

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