私はSimpleDateFormatコンストラクタを持っています
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
私は文字列"2013-09-29T18:46:19Z".
を解析しています
ここでZはGMT/UTC
タイムゾーンを表していることを読みました。しかし、この日付をコンソールに表示すると、返された日付のISTタイムゾーンが表示されます。
今私の質問は私の出力が正しいか間違っているかどうかです。
タイムゾーンに日付/時刻の最後にZ
を追加するだけで、GMTの日付/時刻のように見えますが、値は変わりません。
タイムゾーンをGMTに設定すればそれは正しいでしょう。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
'T'
と'Z'
はここでは定数と見なされます。引用符なしでZ
を渡す必要があります。さらに、入力文字列でタイムゾーンを指定する必要があります。
例:2013-09-29T18:46:19-0700
そして"yyyy-MM-dd'T'HH:mm:ssZ"
の形式
ISO 8601文字列からJava Dateオブジェクトへ
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013
TimeZone.getTimeZone("GMT")
を設定しないと、Sun Sep 29 18:46:19 CST 2013
が出力されます。
Java DateオブジェクトからISO 8601文字列へ
Date
オブジェクトをISO 8601規格(yyyy-MM-dd'T'HH:mm:ss'Z'
)に変換するには、次のコードを使用します。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z
また、Zに' '
がない場合、yyyy-MM-dd'T'HH:mm:ssZ
は2015-01-22T03:41:02+0000
を出力します。
Dateの ' standard ' JSON表現を処理したい場合は、次のパターンを使用したほうがよいでしょう:"yyyy-MM-dd'T'HH:mm:ssX"
。
最後のX
に注目してください。 それはISO 8601規格のタイムゾーンを処理します そしてISO 8601はまさにJavascriptのこのステートメントを生成するものですnew Date().toJSON()
他の答えと比較すると、いくつかの利点があります。
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
他のAnswersはJava 8では時代遅れです。
Instant // Represent a moment in UTC.
.parse( "2013-09-29T18:46:19Z" ) // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone( // Adjust from UTC to a time zone.
ZoneId.of( "Asia/Kolkata" )
) // Returns a `ZonedDateTime` object.
あなたの文字列フォーマットは ISO 8601 規格に準拠しています。この規格は、さまざまな日時値をテキストとして表現するための実用的な形式を定義します。
古いJava.util.Date
/.Calendar
クラスおよびJava.text.SimpleDateFormat
クラスは、Java 8以降に組み込まれたJava.timeフレームワークに取って代わられました。 チュートリアル を参照してください。 古いクラスは避けてください 設計が不適切で、混乱しやすく、面倒です。
古いクラスの貧弱な設計の一部はあなたを悩ませました。そこでは、実際にはUTC(GMT)である日時値のテキスト表現を生成するときにtoString
メソッドがJVMの現在のデフォルトタイムゾーンを適用します。善意ですが混乱します。
Java.timeクラスは、日付/時刻値のテキスト表現を解析/生成するときに、デフォルトでISO 8601フォーマットを使用します。構文解析パターンを指定する必要はありません。
Instant
は、 _ utc _ のタイムライン上の瞬間です。
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
ZonedDateTime
オブジェクトを生成するために必要に応じて タイムゾーン を適用できます。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
そして、Java8を使うオプションがない場合は、 'yyyy-MM-dd'T'HH:mm:ssX _ xx _ を使用してください。そうではないかもしれません...あなたの解析関数によっては)
Xが生成します:+01
XXXが生成します:+01:00