Java SimpleDateFormat(“ yyyy-MM-dd'T'HH:mm:ss'Z '”)はタイムゾーンをISTとして提供します


148

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

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

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

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

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


3
はい、それは「Z」が表すものです。Z-タイムゾーン
Woody

5
Z =ズールー時間=> GMT + 0、あなたは明らかにあなたの国に奉仕しませんでした;)
MushyPeas 2018年

回答:


250

タイムゾーンを設定していないZため、日付/時刻の末尾にが追加されただけなので、GMT日付/時刻のように見えますが、これによって値が変更されることはありません。

タイムゾーンをGMTに設定します。これで正確になります。

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

3
日付がある場合、たとえばZなしで2012-12-06T06:00:00とすると、それはGMTを表しますか?
バイナリジャイアント、2014年

3
@binarygiantあなたはそれを送った人に尋ねなければならないでしょう。送信者の現地時間である可能性があります。
Peter Lawrey、2014年

2
タイムゾーンは "UTC"に設定できます
Prashanth 2015年

2
さまざまなライブラリの多くの場所でタイムゾーンを設定し、マシン/ラップトップのタイムゾーンとの競合を回避する代わりに、user.timezoneシステムプロパティを設定して常にJVMのデフォルトのタイムゾーンを設定する必要があります。java-Duser.timezone = GMT ...
kisna

100

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

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


Subir、回答ありがとうございます。入力文字列に「0700」は何が付加されていますか?
Pradip Borde 2013

-0700タイムゾーンです。つまり、-7:00 Hrs
Subir Kumar Sao

12
-07:00時間では-0700ではなく、次のようになります。yyyy-MM-dd'T'HH:mm:ss.SSSXXX
Tastybrownies

48

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


2
java.text.ParseException:Unparseable date: "2018-05-01T18:30:00.000Z" @AZ_
Mansuu ....

41

日付の「標準」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"));

1
私が使用していますplayの自動結合形式、および使用の@Format.DateTime注釈を。Z末尾にデフォルトのパターンを使用すると正しくないようです。に変更するとX、機能します。どうもありがとう
トランザング2016

日付がタイムゾーンを「-0500」のようなRFC822準拠の方法で指定している場合、これは正常に機能します。ただし、「2013-07-15T10:22:17-05:00」などの日付(ISO8601 TZも有効)の場合、これは機能しません。その場合、「yyyy-MM-dd'T'HH:mm:ssXXX」を使用する必要があります。
Lambart 2017

23

tl; dr

他の回答は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フレームワークに取って代わられました。チュートリアルを参照してください。古いクラスは設計が不十分で、混乱し、面倒であることがわかっているため、古いクラスは避けてください

古いクラスの貧弱な設計の一部はあなたを悩ませました、そこで、toStringメソッドは実際にUTC(GMT)である日時値のテキスト表現を生成するときに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 );

モダンとレガシーの両方のJavaの日時タイプの表


22

また、java8に進むオプションがない場合は、 'yyyy-MM-dd'T'HH:mm:ssX XX 'を使用することをお勧めします。これは、正しく正しく解析されるためです(Xが1つだけの場合は、そうではない場合があります。 ..解析関数に応じて)

X生成:+01

XXXが生成:+01:00


0

Java 8の場合:次の ように、組み込みjava.time.format.DateTimeFormatterを使用してタイプミスの可能性を減らすことができます。

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME 2011-12-03T10:15:30+01:00[Europe/Paris]は、Oracle リンクによって提供されるバンドルされた標準DateTime形式の1つを表します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.