JavaのDateクラスに問題があります。日付クラスはローカルマシンの日付を返しますが、UTC-0が必要です。
私はググってJavaScriptには素晴らしい解決策を見つけましたが、Javaには何の役にも立ちません。
Java 8でUTC + 0の日付を取得する方法
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;
OffsetDateTime
ではなく、ZonedDateTime
私たちはオフセットUTC-からではなく、フルタイムゾーン単なるで作業していることを考えると?
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
ます。UTCからのオフセットを指定します。java.timeでは、これはZoneOffset
オブジェクトを意味します。ここでは、便利な定数を使用できるように、UTC(+00)を使い続けたいと考えていますZoneOffset.UTC
。
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
ます。したがって、出力で15
は19
時刻が時間ではなく4時間早いことに注意してください。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 )
and を使用していjava.util.Date::toInstant
ます。
java.util.Date utilDate = java.util.Date.from( instant );
そして、他の方向に行きます。
Instant instant= utilDate.toInstant();
同様に、との間で変換するためにGregorianCalendar
(のサブクラスCalendar
)に追加された新しいメソッドを探しますjava.time.ZonedDateTime
。
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
詳細については、Oracleチュートリアルを参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。Hibernate 5とJPA 2.2はjava.timeをサポートしています。java.sql.*
java.timeクラスはどこで入手できますか?
ZonedDateTime
、すべてZoneId
をZoneOffset
使用できる1つにマップするため、必要はありませんOffsetDateTime
。
java8では、Instant
すでにUTCにあり、作業に便利なクラスを使用します。
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);
Java8では、新しいTime API を使用し、UTC TimeZoneを使用してインスタントをZonedDateTimeに変換します
Java 8の1行ソリューション:
public Date getCurrentUtcTime() {
return Date.from(Instant.now());
}
java.util.Date
ローカルマシンの日付ではありません。これは常に、UTC + 00:00を基準とした1970-01-01からの経過ミリ秒として定義されます。多分そのメソッドの振る舞いがtoString()
あなたを混乱させ、どれが実際にローカルタイムゾーンの表現を使用しているのでしょう。