Javaで現在の日付と時刻をUTCまたはGMTで取得するにはどうすればよいですか? 質問する

Javaで現在の日付と時刻をUTCまたはGMTで取得するにはどうすればよいですか? 質問する

新しいDateオブジェクトを作成すると、現在の時刻に初期化されますが、ローカル タイムゾーンになります。現在の日付と時刻を GMT で取得するにはどうすればよいでしょうか。

ベストアンサー1

要約

Instant.now()   // Capture the current moment in UTC. 

その値を表す文字列を生成します。

Instant.now().toString()  

2016-09-13T23:30:52.123Z

詳細

としてジョン・スキートの正解前述のように、java.util.Dateオブジェクトにはタイムゾーンがありません。しかし、toString実装では、日付と時刻の値の文字列表現を生成するときに、JVM のデフォルトのタイムゾーンを適用します。初心者のプログラマーにとって混乱を招くかもしれませんが、Date にはタイムゾーンがあるように見えますが、実際にはそうではありません。

Java にバンドルされている、、およびクラスは、非常に厄介なことで有名です。java.util.Dateこれらj.u.Calendarのクラスは使用しないでください。代わりに、次の有能な日付/時刻ライブラリのいずれかを使用してください。java.text.SimpleDateFormat

java.time (Java 8)

Java 8素晴らしい新しいjava.time.* パッケージ古い java.util.Date/Calendar クラスを置き換えるためです。

UTC/GMT で現在の時刻を取得するのは簡単なワンライナーです…

Instant instant = Instant.now();

それInstantクラスはjava.timeの基本的な構成要素であり、タイムライン上の瞬間を表します。UTC決議によりナノ秒

Java 8 では、現在の瞬間は最大ミリ秒の解像度でのみキャプチャされます。Java 9は新たな実装をもたらすClockホスト コンピュータのクロック ハードウェアの能力に応じて、このクラスの最大ナノ秒機能で現在の瞬間をキャプチャします。

toStringメソッドは、Instantその値の文字列表現を生成します。特定の ISO 8601 形式このフォーマットは、0、3、6、または9桁の数字を出力します(ミリ秒マイクロ秒、 またはナノ秒)を必要に応じて追加して、秒の小数部を表します。

より柔軟なフォーマットやその他の追加機能が必要な場合は、UTC自体にUTCからのオフセットをゼロに設定します(ZoneOffset.UTC絶え間ない)を取得するにはOffsetDateTime

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );

コンソールにダンプします…

System.out.println( "now.toString(): " + now );

実行すると…

now.toString(): 2014-01-21T23:42:03.522Z
Java の最新および従来の日付/時刻型の表。

java.timeについて

java.timeフレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い遺産日付と時刻のクラスjava.util.DateCalendar、&SimpleDateFormat

詳細については、Oracle チュートリアル. そして、Stack Overflowで多くの例と説明を検索してください。仕様はJSR310

ジョダタイムプロジェクト、現在メンテナンスモード、への移行を勧めているjava.timeクラス。

java.timeオブジェクトをデータベースと直接交換することができます。JDBC ドライバー準拠JDBC 4.2またはそれ以降。文字列もクラスも必要ありませんjava.sql.*

java.time クラスはどこで入手できますか?

どのバージョンの Java または Android でどの java.time ライブラリを使用するかを示す表

スリーテンエクストラプロジェクトは、java.time に追加のクラスを追加して拡張します。このプロジェクトは、java.time に将来追加される可能性のある機能の実証の場です。ここでは、次のような便利なクラスが見つかるかもしれません。IntervalYearWeekYearQuarter、 そしてもっと


ジョダタイム

更新:ジョダタイムプロジェクト、現在メンテナンスモード、への移行を勧めているjava.timeクラス。

使用方法ジョダタイムサードパーティのオープンソースの無料ライブラリを使用すると、たった 1 行のコードで現在の日時を取得できます。

Joda-Time は Java 8 の新しい java.time.* クラスに影響を与えましたが、アーキテクチャが異なります。古いバージョンの Java でも Joda-Time を使用できます。Joda-Time は Java 8 でも引き続き動作し、積極的に保守されています (2014 年現在)。ただし、Joda-Time チームは java.time への移行を推奨しています。

System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );

より詳細なサンプルコード (Joda-Time 2.3)…

org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );

コンソールにダンプします…

System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );

実行すると…

Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z

タイムゾーンに関するサンプルコードの詳細については、私の答え同様の質問に対して。

タイムゾーン

JVM の現在のデフォルトのタイム ゾーン (いつでも変更される可能性があります) に暗黙的に依存するのではなく、常にタイム ゾーンを指定することをお勧めします。このような依存は、日付と時刻の処理で混乱やバグが発生する一般的な原因のようです。

電話をかける際は、now()割り当てたいタイムゾーンを伝えてください。DateTimeZoneクラス。

DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );

そのクラスはUTCの定数タイムゾーン。

DateTime now = DateTime.now( DateTimeZone.UTC );

JVM の現在のデフォルトのタイムゾーンを本当に使用したい場合は、明示的に呼び出して、コードが自己文書化されるようにします。

DateTimeZone zoneDefault = DateTimeZone.getDefault();

8601 規格

詳しくはこちら8601 規格形式。java.time と Joda-Time はどちらも、文字列の解析と生成の両方において、その標準の適切な形式をデフォルトとして使用します。


実際、java.util.Date には、ソース コードの層の奥深くに埋め込まれたタイム ゾーンがあります。ほとんどの実用目的では、そのタイム ゾーンは無視されます。したがって、省略形として、java.util.Date にはタイム ゾーンがないとします。さらに、その埋め込まれたタイム ゾーンは、Date のメソッドで使用されるものではありませtoStringそのメソッドは、JVM の現在のデフォルトのタイム ゾーンを使用します。この紛らわしいクラスを避け、Joda-Time と java.time を使用する理由はさらに増えます。

おすすめ記事