2016-01-06 32 views
8

Tôi đang cố gắng xây dựng một DateTimeFormatter có thể chấp nhận bù trừ với dấu hai chấm hoặc bù trừ mà không có dấu hai chấm.Java DateTimeFormatter cho múi giờ với dấu phân tách dấu hai chấm tùy chọn?

Có cách nào để vượt qua bài kiểm tra này:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[X]"); 
dateTimeFormatter.parse("2015-01-28T10:21:44+0100"); // OK 
dateTimeFormatter.parse("2015-01-28T10:21:44+01:00"); // KO 
+0

Dấu hai chấm bạn coi là tùy chọn là phần cố định của phần bù vùng. Bạn chỉ có thể chọn giữa các mẫu chữ X (không có dấu hai chấm) hoặc XXX (có dấu hai chấm). Điều đó có nghĩa là bù trừ toàn bộ vùng là tùy chọn, không chỉ là dấu hai chấm bên trong. –

+0

Tôi đồng ý, nó sẽ hoạt động. Nhưng khi tôi sử dụng [X] nó mong đợi một sự bù trừ không có dấu hai chấm và khi tôi sử dụng [XXX] nó mong đợi một sự bù đắp với dấu hai chấm. Tôi không thể sử dụng cả hai cùng nhau. –

+0

Theo Javadoc: với các biểu tượng X đề tài ví dụ được đưa ra: Z; -08; -0830; -08: 30; -083015; -08: 30: 15; –

Trả lời

10

này: yyyy-MM-dd'T'HH:mm:ss[XXX][X] dường như làm việc.

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[XXX][X]"); 
dateTimeFormatter.parse("2015-01-28T10:21:44+0100"); 
dateTimeFormatter.parse("2015-01-28T10:21:44+01:00"); 

Here is an example

+1

Vâng, nó hoạt động! Tôi đã thử [X] [XXX] (không hoạt động) nhưng không [XXX] [X]. Cảm ơn! –

+0

@NelsonG. Không có gì. Chúc may mắn. – Titus

+1

Một khía cạnh kỳ lạ: Nếu đầu vào chứa HAI bù trừ thì điều này cũng có thể được phân tích cú pháp. –

8

Đây là mô hình cuối cùng phù hợp cho tất cả mọi thứ khá trông như một chuỗi ngày ISO!

"[yyyyMMdd][yyyy-MM-dd][yyyy-DDD]['T'[HHmmss][HHmm][HH:mm:ss][HH:mm][.SSSSSSSSS][.SSSSSS][.SSS][.SS][.S]][OOOO][O][z][XXXXX][XXXX]['['VV']']" 

Nó hoạt động cho danh sách sau đây của các bài kiểm tra ngoại trừ hai trong ý kiến ​​nhưng tôi vẫn không biết tại sao ...

ZonedDateTime dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00:00[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+020000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0200[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993Z[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993GMT+1[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993UTC[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993PST[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993[Europe/Paris]"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08+02:00[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+020000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0200[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0000[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08Z[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08GMT+1[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08UTC[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08PST[Europe/Paris]"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08[Europe/Paris]"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+02:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+020000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0200"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993+0000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993Z"); 
    //dt = DateTimeUtils.parse("2016-10-27T16:36:08.993GMT+1"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993UTC"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993PST"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08.993"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.000993"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08.000000993"); 

    dt = DateTimeUtils.parse("2016-10-27T16:36:08+02:00:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+02:00"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+020000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0200"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08+0000"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08Z"); 
    //dt = DateTimeUtils.parse("2016-10-27T16:36:08GMT+1"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08UTC"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08PST"); 
    dt = DateTimeUtils.parse("2016-10-27T16:36:08"); 

    dt = DateTimeUtils.parse("2016-100T16:36:08Z"); 
    dt = DateTimeUtils.parse("2016-100T16:36.1Z"); 
    dt = DateTimeUtils.parse("2016-10-27"); 

    dt = DateTimeUtils.parse("20161223T163608"); 
    dt = DateTimeUtils.parse("20161223T1636"); 

Và phương pháp phân tích cú pháp riêng của mình:

public static ZonedDateTime parse(CharSequence text) { 
    TemporalAccessor temporalAccessor = LOOSE_ISO_DATE_TIME_ZONE_PARSER.parseBest(text, ZonedDateTime::from, LocalDateTime::from, LocalDate::from); 
    if (temporalAccessor instanceof ZonedDateTime) { 
     return ((ZonedDateTime) temporalAccessor); 
    } 
    if (temporalAccessor instanceof LocalDateTime) { 
     return ((LocalDateTime) temporalAccessor).atZone(ZoneId.systemDefault()); 
    } 
    return ((LocalDate) temporalAccessor).atStartOfDay(ZoneId.systemDefault()); 
} 
+0

Tôi giả định rằng nó không hoạt động đối với những người bình luận vì bạn không phục vụ cho "+1" sau GMT. Cấp, tôi không nhận ra những biểu hiện, nhưng có vẻ như không có phục vụ cho "+" - ký bất cứ nơi nào? – junkfoodjunkie

+0

Đó là nghĩa vụ phải nhận ra GMT + 1 như một toàn thể, như nó cho 2016-10-27T16: 36: 08.993GMT + 1 [Châu Âu/Paris] mặc dù. –

+0

OK - Châu Âu/Paris kết thúc bằng văn bản/dấu mũ, mặc dù, những cái không hoạt động kết thúc bằng "+1" - tôi có thể là cái gì đó :) – junkfoodjunkie

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