モジュール java.base
パッケージ java.time

クラスInstant

java.lang.Object
java.time.Instant
すべての実装されたインタフェース:
Serializable, Comparable<Instant>, Temporal, TemporalAccessor, TemporalAdjuster

public final class Instant extends Object implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable
時系列の時点。

このクラスは時系列上の単一時点をモデル化します。 これは、イベントタイムスタンプをアプリケーションに記録するために使用できます。

インスタントの範囲は、longよりも大きな秒数の保存を必要とします。 これを実現するために、このクラスはエポック秒を表すlongと、「1秒のうちのナノ秒」を表すint(常に0と999,999,999の間になる)を保存します。 エポック秒は、標準Javaエポック (1970-01-01T00:00:00Z) から測定されます。エポック後のインスタントは正の値を持ち、エポック前のインスタントは負の値を持ちます。 エポック秒とナノ秒の部分では、大きな値は小さな値よりも時系列上で常に後になります。

タイム・スケール

人間が時間を測定する標準手段は太陽日の長さです。 この長さは伝統的に、24時間/60分/60秒に分割されてきました(86400秒/日)。

現代の計時は、セシウム原子の遷移を基準としてSI秒を正確に定義する原子時計に基づいています。 SI秒の長さは1日の86400分の1に非常に近くなるように定義されました。

残念なことに、地球が回転すると1日の長さは変わります。 さらに、時間の経過とともに地球の速度が遅くなり、1日の平均の長さが長くなりつつあります。 その結果、2012年の太陽日の長さは86400 SI秒より若干長いです。 任意の特定日の実際の長さと地球の速度が遅くなる時間量は予測できず、測定によってのみ決定できます。 UT1タイム・スケールは1日の正確な長さを計算し、その日が終わった後一定期間のみ使用できます。

UTCタイム・スケールは、UT1の1秒未満の時間をまとめて整数秒(うるう秒と呼ばれる)にする標準アプローチです。 うるう秒は地球の回転の変化に応じて追加または削除されます。 つまり、UTCは、1日を太陽と整合させるために、必要に応じて1日が86399 SI秒または86401 SI秒であることを許可します。

現代のUTCタイム・スケールは、1972年に導入されたもので、整数うるう秒の概念を導入しました。 1958年から1972年の間はUTCの定義は複雑で、概念上の秒の長さに対して秒未満の小さな調整を行っていました。 2012年現在は、UTCの定義をさらに変更する協議が進行中です。うるう秒が廃止されたり、ほかの変更が導入される可能性もあります。

これまで説明してきたように、正確な計時は複雑なことを考慮して、このJava APIでは独自のタイム・スケール(Javaタイム・スケール)を定義します。

Javaタイム・スケールでは、各暦日を正確に86400下位区分(秒と呼ばれます)に分割します。 これらの秒はSI秒と異なる場合があります。 デファクト国際民間タイム・スケールと厳密に一致し、その定義は随時変わります。

Javaタイム・スケールには、民間時間のベースとして使用されるコンセンサス国際タイム・スケールに基づいて、わずかに異なる定義を持つ時系列セグメントが存在します。 国際的に合意されたタイム・スケールが変更または置換されるたびに、そのための新しいJavaタイム・スケール・セグメントが定義される必要があります。 各セグメントはこれらの要件を満たす必要があります。

  • Javaタイム・スケールは、基礎となる国際民間タイム・スケールと厳密に一致する。
  • Javaタイム・スケールは、国際民間タイム・スケールと毎正午に正確に一致する。
  • Javaタイム・スケーツは、国際民間タイム・スケールに対する正確に定義された関係を持つ。
2013年現在、Javaタイム・スケールには2つのセグメントがあります。

1972年11月3日(これから説明する正確な境界)からのセグメントの場合、別途通知があるまでコンセンサス国際タイム・スケールはUTC(うるう秒を使用)です。 このセグメントでは、Javaタイム・スケールはUTC-SLSと同一です。 これは、うるう秒のない日ではUTCと同一です。 うるう秒がある日では、うるう秒がその日の最後の1000秒に均等に分散され、表面上は厳密に86400秒/日のままです。

1972年11月03日より前のセグメントの場合、任意の遠い過去にさかのぼって、コンセンサス国際タイム・スケールはUT1であるように定義され、先発的に適用されます。グリニッジ子午線上の(平均)太陽時と同等です。 このセグメントでは、Javaタイム・スケールはコンセンサス国際タイム・スケールと同一です。 2つのセグメントの間の正確な境界は、1972-11-03T00:00と1972-11-04T12:00との間の、UT1 = UTCであるインスタントです。

JSR-310 APIを使用するJavaタイム・スケールの実装は、1秒未満まで正確であるクロックや、単調または滑らかに進むクロックを提供することは求められません。 したがって実装は、実際にUTC-SLS slewを実行する必要はなく、そうでない場合でもうるう秒を意識する必要はありません。 ただし、JSR-310は、現在のインスタントを表現するクロックを定義するときに使用するアプローチを実装がドキュメント化する必要があることを求めています。 使用可能なクロックの詳細については、Clockを参照してください。

Javaタイム・スケールはすべての日付/時間クラスで使用されます。 これにはInstantLocalDateLocalTimeOffsetDateTimeZonedDateTimeおよびDurationが含まれます。

これはvalue-basedクラスです。プログラマは、equalのインスタンスを交換可能として扱い、同期にインスタンスを使用しないようにする必要があります。そうしないと、予期しない動作が発生する可能性があります。 たとえば、将来のリリースでは、同期が失敗する可能性があります。 比較する場合は、equalsメソッドを使用することをお薦めします。

実装要件:
このクラスは不変でスレッドセーフです。
導入されたバージョン:
1.8
関連項目: