web-dev-qa-db-ja.com

Java 8でUTC + 0日付を取得する方法は?

JavaのDateクラスに問題があります。日付クラスはローカルマシンの日付を返しますが、UTC-0が必要です。

私はグーグルでグーグル検索を行いましたが、JavaScriptの優れたソリューションを見つけましたが、Javaには何も役に立ちません。

Java 8でUTC + 0日付を取得する方法は?

85
Mark

Java 8を使用すると、次のように記述できます。

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

あなたのコメントに答えるために、それを日付に変換することができます(あなたがレガシーコードに依存していない限り、理由はわかりません)またはエポック以降のミリ秒に変換できます:

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
128
assylias

tl; dr

Instant.now()

Java.time

Javaの最も初期のバージョンにバンドルされている面倒な古い日時クラスは、Java 8以降に組み込まれた Java.time クラスに取って代わられました。 Oracleチュートリアル を参照してください。機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされ、 ThreeTenABP のAndroidにさらに適合されています。

Instant

Instant は、 UTC のタイムライン上の瞬間を表し、最大解像度は ナノ秒 です。

Instant instant = Instant.now();

toStringメソッドは、標準の ISO 8601 形式のいずれかを使用して、日時値を表すテキストを含むStringオブジェクトを生成します。

String output = instant.toString();  

2016-06-27T19:15:25.864Z

Instantクラスは、Java.timeの基本的なビルディングブロッククラスです。一般的にベストプラクティスはUTCで日時値を追跡、保存、交換することであるため、これは日時を処理する際の重要なクラスになります。

OffsetDateTime

ただし、Instantには、代替フォーマットで文字列を生成するためのフォーマットオプションがないなどの制限があります。柔軟性を高めるには、Instantから OffsetDateTime に変換します。 offset-from-UTC を指定します。 Java.timeでは、 ZoneOffset オブジェクトを意味します。ここでは、便利な定数 ZoneOffset.UTC を使用できるように、UTC(+00)に固執する必要があります。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

2016-06-27T19:15:25.864Z

または、Instantクラスをスキップします。

OffsetDateTime.now( ZoneOffset.UTC )

これで、OffsetDateTimeオブジェクトが手元にあるので、 DateTimeFormatter を使用して、代替形式のテキストを含むStringオブジェクトを作成できます。 DateTimeFormatterの使用例については、スタックオーバーフローを検索してください。

ZonedDateTime

特定のタイムゾーンの 壁時計時間 を表示する場合は、 ZoneId を適用して ZonedDateTime を取得します。

この例では、モントリオールのタイムゾーンを適用します。夏の 夏時間(DST) ナンセンスでは、ゾーンのオフセットは-04:00です。そのため、出力で時刻が4時間前になっていることに注意してください。15時間ではなく、19です。 InstantZonedDateTimeは両方ともまったく同じ瞬間を表し、2つの異なるレンズを通して見たものです。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15:15:25.864-04:00 [アメリカ/モントリオール]

変換中

古い日時クラスを避ける必要がありますが、必要な場合は、古いクラスに追加された新しいメソッドを使用して変換できます。ここでは、 Java.util.Date.from( Instant ) および Java.util.Date::toInstant を使用します。

Java.util.Date utilDate = Java.util.Date.from( instant );

そして、他の方向に向かっています。

Instant instant= utilDate.toInstant();

同様に、Java.time.ZonedDateTimeとの間で変換するGregorianCalendarCalendarのサブクラス)に追加された新しいメソッドを探します。

Table of types of date-time classes in modern Java.time versus legacy.


Java.timeについて

Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendar 、および SimpleDateFormat などの厄介な古い レガシー 日時クラスに取って代わります。

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列もJava.sql.*クラスも必要ありません。

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

  • Java SE 8Java SE 9 、およびそれ以降
    • ビルトイン。
    • 実装がバンドルされた標準Java APIの一部。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6および7にバックポートされています。
  • Android
    • Android以降のバージョンは、Java.timeクラスの実装をバンドルしています。
    • 以前のAndroid(<26)の場合、 ThreeTenABP プロジェクトは ThreeTen-Backport(上記)。 「 ThreeTenABPの使用方法… 」を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuartermore などの便利なクラスがここにあります。

128
Basil Bourque

Java8では、新しいTime APIを使用し、 Instant inを ZonedDateTime に変換します TC TimeZone を使用します

3
rolfl

Java8では、既にUTCにあるInstantクラスを使用します。

import Java.time.Instant;

Instant ins = Instant.now();
long ts = ins.toEpochMilli();

Instant ins2 = Instant.ofEpochMilli(ts)

または、次を使用できます。

import Java.time.*;

Instant ins = Instant.now(); 

OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

Instantに戻る

Instant ins4 = Instant.from(odt);
0
Abel Terefe