2016-01-06 48 views
8

我想構建一個DateTimeFormatter,它可以用冒號或偏移量來接受偏移量而不用冒號。帶有可選冒號分隔符的Java DateTimeFormatter時區?

有沒有辦法通過這個測試:

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

您認爲可選的冒號是區域偏移量部分的固定部分。您只能選擇模式字母X(不含冒號)或XXX(含冒號)。這意味着整個區域偏移量是可選的,而不僅僅是內部的冒號。 –

+0

我同意,它應該工作。但是,當我使用[X]時,它預計沒有冒號的偏移量,當我使用[XXX]時,它期望有冒號的偏移量。我不能一起使用兩者。 –

+0

根據Javadoc:用符號X給出這些例子:Z; -08; -0830; -08:30; -083015; -08:30:15; –

回答

10

此:yyyy-MM-dd'T'HH:mm:ss[XXX][X]似乎工作。

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

是的,它的工作原理!我嘗試了[X] [XXX](不工作),但沒有[XXX] [X]。謝謝! –

+0

@NelsonG。別客氣。祝你好運。 – Titus

+1

一個奇特的方面:如果輸入包含兩個偏移量,那麼這也可能被解析。 –

8

這裏是非常一切看上去就像一個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']']" 

它適用於中除了兩個意見,但測試下面的列表中我還是不知道爲什麼...

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"); 

與解析方法本身:

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

我假設它不適用於評論中的人,因爲格林尼治標準時間之後你還沒有照顧到「+1」。當然,我不承認這些表達方式,但似乎沒有爲「+」 - 任何地方的標誌提供餐飲服務? – junkfoodjunkie

+0

雖然它應該認識到GMT + 1的整體情況,但它也適用於2016-10-27T16:36:08.993GMT + 1 [歐洲/巴黎]。 –

+0

好的 - 歐洲/巴黎以文字/插入符號結尾,儘管不工作的人以「+1」結尾 - 我可能會在那裏:) – junkfoodjunkie