あなたはに書式を変更する必要がありますオフセット部分のみ(-05:00
など - GMT+03:00
が見つかる場合は不要です)。
formatter.parse(date)
は、TemporalAccessor
オブジェクトを返します。
System.out.println(ZonedDateTime.parse(date, formatter)); // 2017-07-05T12:28:36.400+03:00[GMT+03:00]
PS:あなたが特定のタイプを作成する場合、それはクラスのそれぞれのparse
メソッドを使用する方が良いでしょうをこのフォーマッタを持つ唯一の問題は、書式設定するとき、それはすべてのオプションを印刷し、ということですセクション。あなたはこのような何かを行うのであれば、:
String date = "2017-07-05T12:28:36.4TGMT+03:00";
ZonedDateTime z = ZonedDateTime.parse(date, formatter);
System.out.println(formatter.format(z));
は、出力は次のようになります。
2017-07-05T12:28:36.4TGMT + 03:00 + 03:00
GMT+03:00
がzzz
の結果であり、2番目の+03:00
がxxx
の結果であるからです。あなたがこれを望まないなら、私は2種類の異なるDateTimeFormatter
(構文解析のためのもの、フォーマットのためのもの)を使用して推薦します。
か(「醜い」アプローチ)、2つの異なるフォーマッタを使用します。次に
DateTimeFormatter noGMT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.S]'T'zzzxxx");
DateTimeFormatter gmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.S]'TGMT'xxx");
は、あなたが最初に解析しよう - あなたは例外を取得する場合、第二にしてみてください(またはあなたがいるかどうかをチェック入力にはGMT
が含まれています)。
私は個人的にはこれが好きではありません。GMT
はゾーン名の一部であり、リテラルとして扱われるべきではないからです。しかし最終的には、正しいオフセットでZonedDateTime
が得られるので、このアプローチがどれほど間違っているか分かりません。
タイムゾーンの略語
彼らはambiguous and not standardているので、あなたが(CDT
またはなど)3文字の略称を使用して(可能な限り)避けなければならないことに注意してください。 CDT
は、Central Daylight Time
(UTC-05:00)、Cuba Daylight Time
(UTC-04:00)またはChina Daylight Time
(UTC + 09:00)のいずれでもかまいません。
可能であれば、IANA timezones names(常にAmerica/Sao_Paulo
またはEurope/Berlin
のような形式Continent/City
)を使用することをお勧めします。そのリストに基づいて、CDT
の省略形を使用する(または過去に使用した)40以上のタイムゾーンがあります。
CDT
このような場合には省略時の値が設定されている可能性がありますが、これはおそらく互換性の理由によるものですが、すべての場合に頼ってはいけません。
タイムゾーンの略語が常に機能するようにするには(使用できない場合に備えて)、優先ゾーンのセットを使用するフォーマッタを作成します。この場合、私は(そう、CST
またはCDT
はシカゴのタイムゾーンとして解析されます)America/Chicago
を使用しています:
Set<ZoneId> preferedZones = new HashSet<>();
preferedZones.add(ZoneId.of("America/Chicago"));
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// append first part of pattern (before timezone)
.appendPattern("yyyy-MM-dd'T'HH:mm:ss[.S]'T'")
// append zone name, use prefered zones (optional)
.optionalStart().appendZoneText(TextStyle.SHORT, preferedZones).optionalEnd()
// offset (optional)
.appendPattern("[xxx]")
// create formatter
.toFormatter();
このフォーマッタが(ととGMT
なし)の両方ご入力に対して、上記と同じように動作し、 CDT
が入力されている場合は、デフォルトのタイムゾーンとしてAmerica/Chicago
を使用します。ユースケースに応じて、セット内に必要な数のゾーンを追加できます。
上記のように、このフォーマッタは出力に関して同じ問題があることを思い出してください(すべてのオプションセクションを出力します)。
これは奇妙なフォーマットです。可能であれば、標準の[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)フォーマットに固執してください。 –