web-dev-qa-db-ja.com

Java SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss'Z '")は、タイムゾーンをISTとして返します。

私はSimpleDateFormatコンストラクタを持っています

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

私は文字列"2013-09-29T18:46:19Z".を解析しています

ここでZはGMT/UTCタイムゾーンを表していることを読みました。しかし、この日付をコンソールに表示すると、返された日付のISTタイムゾーンが表示されます。

今私の質問は私の出力が正しいか間違っているかどうかです。

118
Pradip Borde

タイムゾーンに日付/時刻の最後にZを追加するだけで、GMTの日付/時刻のように見えますが、値は変わりません。

タイムゾーンをGMTに設定すればそれは正しいでしょう。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
197
Peter Lawrey

'T''Z'はここでは定数と見なされます。引用符なしでZを渡す必要があります。さらに、入力文字列でタイムゾーンを指定する必要があります。

例:2013-09-29T18:46:19-0700そして"yyyy-MM-dd'T'HH:mm:ssZ"の形式

76
Subir Kumar Sao

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:ssZ2015-01-22T03:41:02+0000を出力します。

38
AZ_

Dateの ' standard ' JSON表現を処理したい場合は、次のパターンを使用したほうがよいでしょう:"yyyy-MM-dd'T'HH:mm:ssX"

最後のXに注目してください。 それはISO 8601規格のタイムゾーンを処理します そしてISO 8601はまさにJavascriptのこのステートメントを生成するものですnew Date().toJSON()

他の答えと比較すると、いくつかの利点があります。

  1. クライアントにGMTで日付を送信するように要求する必要はありません。
  2. これを使用して、Dateオブジェクトを明示的にGMTに変換する必要はありません。sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
31
MyTitle

tl; dr

他の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

あなたの文字列フォーマットは ISO 8601 規格に準拠しています。この規格は、さまざまな日時値をテキストとして表現するための実用的な形式を定義します。

Java.time

古い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 );
12
Basil Bourque

そして、Java8を使うオプションがない場合は、 'yyyy-MM-dd'T'HH:mm:ssX _ xx _ を使用してください。そうではないかもしれません...あなたの解析関数によっては)

Xが生成します:+01

XXXが生成します:+01:00

12
Thirdman