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

クラスClock

java.lang.Object
java.time.Clock
すべての実装されたインタフェース:
InstantSource

public abstract class Clock extends Object implements InstantSource
タイムゾーンを使用して現在の時点、日付および時間へのアクセスを提供するクロックです。

この抽象クラスのインスタンスは、現在のインスタントのプラガブル表現にアクセスするために使用されます。格納されたタイムゾーンを使用して、現在の日時を検出できます。 たとえば、System.currentTimeMillis()およびTimeZone.getDefault()のかわりにClockを使用できます。

Clockの使用は任意です。 すべての主要な日付/時間クラスには、デフォルト・タイムゾーンのシステム・クロックを使用するnow()ファクトリ・メソッドも用意されています。 この抽象の主要目的は、代替クロックを必要なときにプラグインできるようにすることです。 アプリケーションはstaticメソッドではなくオブジェクトを使用して現在時間を取得します。 これによりテストを単純化できます。

そのため、この抽象クラスは、実際にその結果がタイムラインの現在のインスタントを示していることを保証しません。 かわりに、アプリケーションは現在のインスタント・ゾーンおよびタイムゾーンに対する制御ビューを提供できます。

アプリケーションのベスト・プラクティスは、現在の即時およびタイムゾーンを必要とするメソッドにClockを渡すことです。 これを実現するための1つの方法が、Dependency Injectionフレームワークです。

  public class MyBean {
    private Clock clock;  // dependency inject
    ...
    public void process(LocalDate eventDate) {
      if (eventDate.isBefore(LocalDate.now(clock)) {
        ...
      }
    }
  }
 
この方法では、テスト中にfixedoffsetなどの代替クロックを使用できます。

systemファクトリ・メソッドは、使用可能なシステム・クロックに基づいてクロックを提供します。 これは、System.currentTimeMillis()、またはより分解能の高いクロック(利用できる場合)を使用します。

実装要件:
この抽象クラスは、他のクラスが確実に正しく動作するように、注意して実装する必要があります。 すべての実装がスレッド・セーフである必要がある - 1つのインスタンスは、競合状態などの悪影響なく、複数のスレッドから起動できる必要があります。

主要メソッドは例外のスローを許可するように定義されています。 通常の使用では例外はスローされませんが、唯一可能な実装は、中央の時間サーバーからネットワーク経由で時間を取得します。 このケースでは明らかに、ルックアップが失敗する可能性があるため、そのメソッドは例外をスローすることが許可されます。

Clockから返されるインスタントは、「Instant」で説明されているように、うるう秒を無視するタイム・スケールで機能します。 うるう秒情報を提供するソースを実装がラップしている場合、うるう秒を調整するメカニズムを使用することをお薦めします。 Javaタイムスケールは、UTC-SLSの使用を義務付けます。ただし、クロック実装は、それらがどのように機能するかをドキュメント化している限り、そのタイム・スケールでの精度を選択できます。 したがって実装は、実際にUTC-SLS slewを実行する必要はなく、そうでない場合でもうるう秒を意識する必要はありません。

実装は、可能な場合は常にSerializableを実装するようにしてください。さらに、実装が直列化をサポートするかどうかをドキュメント化する必要があります。

導入されたバージョン:
1.8
関連項目: