2015-06-08 20 views
9

Tôi đang cố gắng phân tích cú pháp: 2014-05-02-10.45.05.993280-5:00 trong đó -5:00 là giá trị bù trừ từ UTC. Sử dụng java.time DateTimeFormatter trong Java 8.mẫu java.time DateTimeFormatter để bù trừ múi giờ

Vì bit đầu tiên, tôi có những điều sau đây: yyyy-MM-dd-HH.mm.ss.SSSSSS tuy nhiên, tôi không thể tìm ra mẫu cũng nên phân tích bù trừ.

Nếu tôi đã có bù đắp với 4 chữ số (-05: 00) tôi có thể sử dụng: yyyy-MM-dd-HH.mm.ss.SSSSSSxxx, nhưng điều này không hoạt động cho 3 chữ số.

Bất kỳ ý tưởng nào?

+1

Bạn đang sử dụng phiên bản Java nào? –

+0

@JonSkeet - xin lỗi, cập nhật bài đăng gốc. – Cheetah

Trả lời

9

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

+0

Mẫu không hoạt động ... nhưng liên kết đến lỗi trông giống như vấn đề của tôi. Tôi đã thử đề xuất của người xây dựng, nhưng điều đó cũng không có tác dụng. – Cheetah

+0

@Cheetah Bạn nói đúng. Xin lỗi vì bạn bị lỗi. Vui lòng xem thêm bản cập nhật của tôi nếu bạn có thể sử dụng bất kỳ giải pháp thay thế nào khác. –

2

offset cho SimpleDateFormat dấu là Z séc Java7 hoặc Java8SimpleDateFormat API.

Sau đó, định dạng phân tích cú pháp của bạn cho String

2014-05-02-10.45.05.993280-5:00 

phải:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ 

CẬP NHẬT: cho DateTimeFormatter bù đắp Patterns cho Formatting và Parsing là:

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; 

Mẫu mong muốn của bạn trong DateTimeFormatterX.

+0

Tôi đang sử dụng 'DateTimeFormatter' và thêm' Z' không xuất hiện ot work – Cheetah

+1

Bạn đã liên kết với Java 7 hai lần. [Java 8 API ở đây.] (Http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) – dcsohl

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