私はSimpleDateFormatコンストラクターを持っています
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
そして私は文字列を解析しています "2013-09-29T18:46:19Z".
ここでZはGMT/UTC
タイムゾーンを表すことを読みました。しかし、この日付をコンソールに出力すると、返された日付のIST timezneが出力されます。
今私の質問は私の出力が正しいか間違っているかです。
私はSimpleDateFormatコンストラクターを持っています
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
そして私は文字列を解析しています "2013-09-29T18:46:19Z".
ここでZはGMT/UTC
タイムゾーンを表すことを読みました。しかし、この日付をコンソールに出力すると、返された日付のIST timezneが出力されます。
今私の質問は私の出力が正しいか間違っているかです。
回答:
タイムゾーンを設定していない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"
-0700
タイムゾーンです。つまり、-7:00 Hrs
ISO 8601文字列からJava日付オブジェクトへ
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日付オブジェクトから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
日付の「標準」JSON表現を処理する場合は、次のパターンを使用することをお勧めします"yyyy-MM-dd'T'HH:mm:ssX"
。
X
終わりに注意してください。 ISO 8601規格のタイムゾーンを処理し、ISO 8601はまさにこのステートメントをJavaScriptで生成するものですnew Date().toJSON()
他の回答と比較すると、いくつかの利点があります。
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
play
の自動結合形式、および使用の@Format.DateTime
注釈を。Z
末尾にデフォルトのパターンを使用すると正しくないようです。に変更するとX
、機能します。どうもありがとう
他の回答は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フレームワークに取って代わられました。チュートリアルを参照してください。古いクラスは設計が不十分で、混乱し、面倒であることがわかっているため、古いクラスは避けてください。
古いクラスの貧弱な設計の一部はあなたを悩ませました、そこで、toString
メソッドは実際にUTC(GMT)である日時値のテキスト表現を生成するときにJVMの現在のデフォルトのタイムゾーンを適用します。意図的だが混乱を招く。
java.timeクラスは、日時値のテキスト表現を解析/生成するときに、デフォルトでISO 8601形式を使用します。したがって、解析パターンを指定する必要はありません。
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
オブジェクトを生成するために、必要に応じてタイムゾーンを適用できますZonedDateTime
。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );