2016-01-06 17 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]は試みませんでした。ありがとう! @ NelsonG。 –

+0

どういたしまして。がんばろう。 – Titus

+1

エキゾチックな側面:入力に2つのオフセットが含まれている場合、これも解析される可能性があります。 –

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']']" 

それは、コメント内の2つを除き、テストの次のリストのために動作しますが、私はまだ理由がわからない...

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

そしてparseメソッド自体:

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

GMT後に "+1"を注文していないので、コメントのものではうまくいかないと思います。確かに、私はそれらの表現を認識しませんが、 "+"記号のケータリングはどこにもないようです。 – junkfoodjunkie

+0

GMT + 1は2016-10-27T16:36:08.993GMT + 1 [Europe/Paris]のように全体的に認識されるはずです。 –

+0

Okay - ヨーロッパ/パリはテキストで終わっていますが、動作していないものは "+1"で終わっています - 私はそこに何かあるかもしれません:) – junkfoodjunkie

関連する問題