新しい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.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.timeについて
のjava.timeフレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い遺産日付と時刻のクラスjava.util.Date
、Calendar
、&SimpleDateFormat
。
詳細については、Oracle チュートリアル. そして、Stack Overflowで多くの例と説明を検索してください。仕様はJSR310。
のジョダタイムプロジェクト、現在メンテナンスモード、への移行を勧めているjava.timeクラス。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC ドライバー準拠JDBC 4.2またはそれ以降。文字列もクラスも必要ありませんjava.sql.*
。
java.time クラスはどこで入手できますか?
- Java SE 8、Java SE 9、Java SE 10、Java SE 11以降 - バンドルされた実装を備えた標準 Java API の一部。
- Java 9 では、いくつかのマイナーな機能と修正が追加されています。
- Java SE 6そしてJava SE 7
- java.timeの機能のほとんどはJava 6と7にバックポートされています。スリーテンバックポート。
- アンドロイド
- Android バンドルの新しいバージョンでは、java.timeクラスの実装がバンドルされています。
- 以前のAndroid(26未満)の場合、スリーテンABPプロジェクトは適応するスリーテンバックポート(上記参照)。ThreeTenABPの使い方…。
のスリーテンエクストラプロジェクトは、java.time に追加のクラスを追加して拡張します。このプロジェクトは、java.time に将来追加される可能性のある機能の実証の場です。ここでは、次のような便利なクラスが見つかるかもしれません。Interval
、YearWeek
、YearQuarter
、 そしてもっと。
ジョダタイム
更新:ジョダタイムプロジェクト、現在メンテナンスモード、への移行を勧めている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 を使用する理由はさらに増えます。