tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
データを知る
人々はエポック以来の数字として時間を追跡する際にさまざまな精度を使用します。したがって、エポック以降のカウントとして解釈されるいくつかの数値を取得する場合は、以下を決定する必要があります。
- どんな時代?
多くのエポック日付がさまざまなシステムで使用されています。一般的に使用されているのはPOSIX / Unix時間で、エポックはUTCで1970年の最初の瞬間です。しかし、この時代を想定するべきではありません。
- どんな精度?エポックから
数秒、ミリ秒、マイクロ秒、またはナノ秒を話しているのですか?
- どんなタイムゾーン?
通常、エポックはUTC / GMTタイムゾーンにあるため、つまりタイムゾーンのオフセットはまったくありません。ただし、経験の浅いプログラマや日時にとらわれないプログラマが関与している場合は、暗黙のタイムゾーンが存在する場合があります。
あなたの場合、他の人が述べたように、あなたはUnixエポックから数秒が与えられたようです。しかし、これらの秒は、ミリ秒を期待するコンストラクターに渡しています。したがって、解決策は1,000を掛けることです。
学んだ教訓:
- 受け取ったデータの意味を判断し、想定しないでください。
- ドキュメントをお読みください。
あなたのデータ
データは秒単位のようです。1970年の初めのエポックを想定し、UTCタイムゾーンを想定すると、1,220,227,200
2008年9月の最初の日の最初の瞬間になります。
ジョーダタイム
Javaにバンドルされているjava.util.Dateクラスと.Calendarクラスは、非常に面倒です。それらを避けてください。代わりに、Joda -TimeライブラリまたはJava 8にバンドルされた(およびJoda -Timeに触発された)新しいjava.timeパッケージを使用してください。
juDateとは異なり、Joda DateTime
-Timeのa は割り当てられたタイムゾーンを本当に知っています。したがって、以下に示すJoda-Time 2.4コードの例では、最初にUTCのデフォルトの仮定を使用してミリ秒を解析することに注意してください。次に、調整するパリのタイムゾーンを割り当てます。宇宙のタイムラインで同じ瞬間が、異なる壁時計時間。デモンストレーションのために、再びUTCに調整します。ほとんどの場合、暗黙のデフォルトに依存するよりも、希望する/予想されるタイムゾーンを明示的に指定する方がよい(多くの場合、日時の作業で問題が発生する原因)。
DateTimeを構築するにはミリ秒が必要です。秒の入力を受け取り、千を掛けます。long
32ビットでオーバーフローするため、結果は64ビットでなければならないことに注意してくださいint
。
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
そのミリ秒数をコンストラクターにフィードします。その特定のコンストラクターは、カウントが1970年のUnixエポックからのものであると想定しています。そのため、構築後、必要に応じてタイムゾーンを調整します。
大陸と都市/地域を組み合わせた適切なタイムゾーン名を使用します。EST
標準化されたものでも一意でもないものなど、3文字または4文字のコードは使用しないでください。
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
デモのために、タイムゾーンを再度調整します。
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
コンソールにダンプします。新しい日がヨーロッパで始まったが、まだアメリカでは始まっていないので、モントリオールでは日付がどのように異なるかに注意してください。
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
実行すると。
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Joda -Timeのメーカーから、代わりのjava.timeフレームワークに都合のよいときにすぐに移行するように依頼されました。Joda-Timeは引き続き積極的にサポートされていますが、今後の開発はすべて、ThreeTen-Extraプロジェクトのjava.timeクラスとその拡張で行われます。
java-timeフレームワークはJSR 310によって定義され、Java 8以降に組み込まれています。java.timeクラスは、上のJava 6&7にバックポートされていますThreeTen-バックポートでプロジェクトとAndroidにThreeTenABPのプロジェクト。
アンは、Instant
タイムライン上の瞬間であるUTCナノ秒の解像度を持ちます。その時代は、UTCにおける1970年の最初の瞬間です。
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
UTCから のオフセットを適用してZoneOffset
を取得しOffsetDateTime
ます。
さらによくわかっている場合は、タイムゾーンZoneId
を適用してを取得しZonedDateTime
ます。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );