Sử dụng chữ cái X thay vì x, do đó XXX. Sự khác biệt là chữ X lớn có thể nhận ra chữ cái đầu vào "Z" là chữ UTC-Offset: 00 trong khi chữ X nhỏ không thể.
mẫu Đề xuất:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
Xin cũng nhận thức sau JDK-bug:
java.time.format.DateTimeFormatter không thể phân tích một bù đắp với single giờ chữ số
CẬP NHẬT:
Tôi hiện đã kiểm tra cách khắc phục được mô tả trong nhật ký lỗi.
String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
Nhưng nó ném một ngoại lệ:
ngoại lệ trong chủ đề java.time.format.DateTimeParseException "chính": Text '2014-05-02-10.45.05.993280-5: Không thể phân tích cú pháp '00' tại chỉ mục 26 tại java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1947) tại java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1849) tại HelloWorld.main (Chào thế giới.java: 16)
Vì vậy, phân tích cú pháp không mệt mỏi cũng không giúp ích gì. Vì vậy, hiện nay chỉ có ba tùy chọn còn lại dành cho bạn:
Sử dụng workaround đề nghị của phóng viên lỗi: [...] Cách giải quyết là để phân tích ngày/thời gian riêng biệt, sử dụng một mã phân tích cú pháp tay cho bù đắp và kết hợp LocalDateTime với bù đắp được phân tích bằng tay. Không phải là một công việc dễ dàng xung quanh.
Hãy thử xử lý trước chuỗi chuyên ngành của riêng bạn. Nếu bạn có một định dạng cố định thì bạn có thể thử chèn số không ở vị trí 26 (nếu tổng chiều dài đầu vào là một chữ số quá nhỏ).
Hoặc bạn sử dụng thư viện bên ngoài có thể thực hiện việc này. Thư viện của tôi Time4J (v4.0) có thể làm điều đó nếu bạn sẵn sàng để thêm một phụ thuộc thêm. Xem mã này:
String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();
Cập nhật: Theo JDK-bug-trạng thái, lỗi này đã được cố định cho Java-9, nhưng một backport cho Java-8 dường như không được có sẵn mặc dù.
Nguồn
2015-06-08 14:05:32
Bạn đang sử dụng phiên bản Java nào? –
@JonSkeet - xin lỗi, cập nhật bài đăng gốc. – Cheetah