JavaのDateクラスに問題があります。日付クラスはローカルマシンの日付を返しますが、UTC-0が必要です。
私はグーグルでグーグル検索を行いましたが、JavaScriptの優れたソリューションを見つけましたが、Javaには何も役に立ちません。
Java 8でUTC + 0日付を取得する方法は?
Java 8を使用すると、次のように記述できます。
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
あなたのコメントに答えるために、それを日付に変換することができます(あなたがレガシーコードに依存していない限り、理由はわかりません)またはエポック以降のミリ秒に変換できます:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
Instant.now()
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
です。 Instant
とZonedDateTime
は両方ともまったく同じ瞬間を表し、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
との間で変換するGregorianCalendar
(Calendar
のサブクラス)に追加された新しいメソッドを探します。
Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
、および SimpleDateFormat
などの厄介な古い レガシー 日時クラスに取って代わります。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。仕様は JSR 31 です。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠する JDBCドライバー を使用します。文字列もJava.sql.*
クラスも必要ありません。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがここにあります。
Java8では、新しいTime APIを使用し、 Instant inを ZonedDateTime に変換します TC TimeZone を使用します
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);