2016-07-11 22 views
8

Tôi có định dạng sau:DateTimeFormatterBuilder với xung đột parseDefaulting quy định cho lĩnh vực NĂM

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendPattern("yyyyMM") 
     .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) 
     .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) 
     .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
     .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
     .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) 
     .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear()) 
     .toFormatter() 
     .withZone(ZoneId.systemDefault()); 

tôi cố gắng phân tích chuỗi "201.505"

System.out.println(ZonedDateTime.parse("201505", formatter)); 

và nó ném một ngoại lệ:

Nguyên nhân: java.time.DateTimeException: Xung đột được tìm thấy: Năm 2016 khác Năm 2015

Nó hoạt động nếu tôi nhận xét cài đặt giá trị mặc định cho NĂM.

Theo như tôi hiểu các tài liệu, nó chỉ nên cố gắng thay thế các giá trị mặc định nếu không có giá trị phân tích cú pháp. Có vẻ như điều này hoạt động trong tháng vì tôi có tháng khác với tháng mặc định được phân tích cú pháp. Tuy nhiên nó không hoạt động trong năm.

Tôi sử dụng nó sai có thể một người nào đó cho tôi biết nếu có một cách khác nhau để xác định giá trị mặc định cho các lĩnh vực mà có thể không có mặt trong một mô hình?

+2

Tại sao bạn muốn phân tích đầu vào ở định dạng "YYYYMM" cho 'ZonedDateTime' và không cho' YearMonth'? –

+0

Tôi có một mã phân tích các định dạng khác nhau có 40-50 mẫu khác nhau mà trình định dạng nhận được. Tôi muốn sử dụng một trình định dạng chung để phân tích cú pháp luôn dẫn đến một ZonedDateTime. Đó chỉ là một trong những trường hợp tôi có. –

+0

Oh thực sự 40-50 mẫu? Bạn cũng có miền địa phương khác không? Điều gì về hiệu suất? Nó phải là xấu do ngoại lệ ném/bắt ngoại lệ. Bạn có thể vui lòng báo cáo trải nghiệm tốc độ của bạn không? –

Trả lời

8

Vấn đề là chữ hoa "y" đề cập đến ChronoField.YEAR_OF_ERA, không phải ChronoField.YEAR. Chỉ cần thay đổi dòng parseDefaulting cuối cùng:

và nó sẽ hoạt động.

+3

Có, nó hoạt động, cảm ơn! –

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