1. ホーム
  2. java

[解決済み】特定のUTC時間形式を理解する YYYY-MM-DDTHH:MM:SS.SSSZ

2022-02-18 15:20:18

質問

関連する質問が2つあります。

BSTで動作するプログラムが、UTC YYYY-MM-DDTHH:MM:SS.SSSZ 形式の現在時刻に対する日付時刻値を生成すると仮定する。

また、ロンドンの現在時刻が2016-06-01 12:33:54であるとします。

  1. プログラムによって与えられた現在時刻が 2016-06-01T11:33:54.000Z である場合、プログラムは間違っているのでしょうか?

  2. BSTのサマーオフセットは、YYYY-MM-DDTHH:MM:SS.SSSZに対応する時間フォーマットでどのように表記されるのでしょうか。

YYYY-MM-DDTHH:MM:SS+0001 と考えていますが、正しいですか?

解決方法は?

まず、iso8601の情報をお読みください。異なるタイムゾーン(サーバーのタイムゾーンとクライアントのタイムゾーンなど)の時間を扱うことが一般的になりつつあり、この規格は本当に便利です。

特に、UTCまたは「ズールー」時間についてお読みください。 こちら .

  1. ロンドン時間は夏の「UTC」時間より1時間進んでいるので、プログラムは正しい

  2. 末尾の'Z'はUTC(ズールー語)を短く表記したものです。Z'の代わりに "+00:00 "と書くこともできます。SS.SSSは秒とミリ秒を表し、タイムゾーンとは関係ない。devnullさんのコメントでは、夏用のオフセットを適用する方法が紹介されています。

編集 :

コメントで、iso8601のtimezoneはtimezoneを含むかどうか、timezoneが実際にプリントアウトされるかどうかという議論がありました。

これは完全に日付/時刻の実装に依存します。もし私たちが SimpleDateFormat の場合、タイムゾーンはサポートされており、印刷されます。

以下は、説明のためのコード例です。

プレ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println(formatter.format(new Date())); formatter.setTimeZone(TimeZone.getTimeZone("Europe/London")); System.out.println(formatter.format(new Date()));

出力

2016-06-02T12:53:14.924Z
2016-06-02T13:53:14.925+01:00

当然ながら、以下のような別の日付/時刻ライブラリを使用している場合 joda-timeその場合、実装の詳細は異なります。

編集する で@DerrylThomasさんが指摘したように SimpleDateFormat 小文字を使うのが賢明 y 年号は、週齢を使用する意図がない限りは、同じような質問に対する別の回答で少し詳しく説明しています。 https://stackoverflow.com/a/56911450 .