1. 概要

このチュートリアルでは、java.timeパッケージからJavaClockクラスを調べます。  Clock クラスとは何か、そしてそれをどのように使用できるかを説明します。

2. 時計クラス

ClockはJava8で追加され、利用可能な最高のシステムクロックを使用して瞬時にアクセスできるようにし、テスト目的で効果的にスタブできるタイムプロバイダーとして使用できるようにします。

現在の日付と時刻はタイムゾーンによって異なります。グローバル化されたアプリケーションの場合、日付と時刻が正しいタイムゾーンで作成されるようにするには、タイムプロバイダーが必要です。

このクラスは、コードの変更がさまざまなタイムゾーンで機能すること、または固定クロックを使用している場合はその時間がコードに影響しないことをテストするのに役立ちます。

Clock クラスは抽象であるため、そのインスタンスを作成することはできません。 次のファクトリメソッドを使用できます。

  • offset(Clock、Duration)– は、指定されたdurationによってオフセットされたクロックを返します。 これの主な使用例は、将来または過去の実行をシミュレートすることです
  • systemUTC()– は、UTCタイムゾーンを表すクロックを返します
  • fixed(Instant、ZoneId)–は常に同じInstantを返します。 これの主な使用例はテストです。固定クロックにより、テストが現在のクロックに依存しないことが保証されます。

Clockクラスで使用可能なほとんどのメソッドを調べます。

2.1. インスタント()

このメソッドは、時計によって定義された現在の瞬間を表す瞬間を返します。

Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant();
System.out.println(instant);

生成されます:

2018-04-07T03:59:35.555Z

2.2. systemUTC()

このメソッドは、UTCゾーンの現在の瞬間を表すClockオブジェクトを返します。

Clock clock = Clock.systemUTC();
System.out.println("UTC time :: " + clock.instant());

生成されます:

UTC time :: 2018-04-04T17:40:12.353Z

2.3. system()

この静的メソッドは、指定されたタイムゾーンIDで識別されるタイムゾーンのClockオブジェクトを返します。

Clock clock = Clock.system(ZoneId.of("Asia/Calcutta"));
System.out.println(clock.instant());

生成されます:

2018-04-04T18:00:31.376Z

2.4.  systemDefaultZone()

この静的メソッドは、現在の瞬間を表し、それが実行されているシステムのデフォルトのタイムゾーンを使用するClockオブジェクトを返します。

Clock clock = Clock.systemDefaultZone();
System.out.println(clock);

上記の行は、次の結果を生成します(デフォルトのタイムゾーンが「アジア/カルカッタ」であると想定)。

SystemClock[Asia/Calcutta]

ZoneId.systemDefault()を渡すことで、同じ動作を実現できます。

Clock clock = Clock.system(ZoneId.systemDefault());

2.5.  millis()

このメソッドは、時計の現在の瞬間をミリ秒単位で返します。 オブジェクトの作成が受け入れられない高性能のユースケースで時計を使用できるようにするために提供されています。 このメソッドは、 System.currentTimeInMillis()を使用していた場所で使用できます。

Clock clock = Clock.systemDefaultZone();
System.out.println(clock.millis());

生成されます:

1523104441258

2.6. offset()

この静的メソッドは、指定された期間が追加された指定されたベースクロックからインスタントを返します。

期間が負の場合、結果のクロックインスタントは、指定されたベースクロックよりも早くなります。

オフセットを使用すると、指定されたベースクロックの過去と未来のインスタントを取得できます。ゼロ期間を渡すと、指定されたベースクロックと同じクロックが取得されます。

Clock baseClock = Clock.systemDefaultZone();

// result clock will be later than baseClock
Clock clock = Clock.offset(baseClock, Duration.ofHours(72));
System.out.println(clock5.instant());

// result clock will be same as baseClock                           
clock = Clock.offset(baseClock, Duration.ZERO);
System.out.println(clock.instant());

// result clock will be earlier than baseClock            
clock = Clock.offset(baseClock, Duration.ofHours(-72));
System.out.println(clock.instant());

生成されます:

2018-04-10T13:24:07.347Z
2018-04-07T13:24:07.348Z
2018-04-04T13:24:07.348Z

2.7. tick()

この静的メソッドは、指定されたクロックから、指定された期間の最も近いオカレンスに丸められたインスタントを返します。 指定されたクロック期間は正である必要があります。

Clock clockDefaultZone = Clock.systemDefaultZone();
Clock clocktick = Clock.tick(clockDefaultZone, Duration.ofSeconds(30));

System.out.println("Clock Default Zone: " + clockDefaultZone.instant());
System.out.println("Clock tick: " + clocktick.instant());

生成されます:

Clock Default Zone: 2018-04-07T16:42:05.473Z
Clock tick: 2018-04-07T16:42:00Z

2.8. tickSeconds()

この静的メソッドは、指定されたタイムゾーンの現在の瞬間の刻々と過ぎを秒単位で返します。 このクロックでは、nano-of-secondフィールドが常にゼロに設定されます。

ZoneId zoneId = ZoneId.of("Asia/Calcutta");
Clock clock = Clock.tickSeconds(zoneId);
System.out.println(clock.instant());

生成されます:

2018-04-07T17:40:23Z

tick()を使用しても同じことができます。

Clock clock = Clock.tick(Clock.system(ZoneId.of("Asia/Calcutta")), Duration.ofSeconds(1));

2.9. tickMinutes()

この静的メソッドは、指定されたタイムゾーンの時計の瞬間を分単位で返します。 この時計では、常にnano-of-secondおよびsecond-of-minuteフィールドがゼロに設定されます。

ZoneId zoneId = ZoneId.of("Asia/Calcutta");
Clock clock = Clock.tickMinutes(zoneId);
System.out.println(clock.instant());

生成されます:

2018-04-07T17:26:00Z

tick()を使用しても同じことができます。

Clock clock = Clock.tick(Clock.system(ZoneId.of("Asia/Calcutta")), Duration.ofMinutes(1));

2.10.  withZone()

このメソッドは、異なるタイムゾーンを持つこのクロックのコピーを返します。

特定のタイムゾーンの時計インスタンスがある場合は、別のタイムゾーンのその時計のコピーを作成できます。

ZoneId zoneSingapore = ZoneId.of("Asia/Singapore");  
Clock clockSingapore = Clock.system(zoneSingapore); 
System.out.println(clockSingapore.instant());

ZoneId zoneCalcutta = ZoneId.of("Asia/Calcutta");
Clock clockCalcutta = clockSingapore.withZone(zoneCalcutta);
System.out.println(clockCalcutta.instant());

生成されます:

2018-04-07T17:55:43.035Z
2018-04-07T17:55:43.035Z

2.11.  getZone()

このメソッドは、指定されたClockのタイムゾーンを返します。

Clock clock = Clock.systemDefaultZone();
ZoneId zone = clock.getZone();
System.out.println(zone.getId());

生成されます:

Asia/Calcutta

2.12. 修繕()

このメソッドは、が常に同じインスタントを返すクロックを返します。 この方法の主な使用例はテストです。固定クロックにより、テストが現在のクロックに依存しないことが保証されます。

Clock fixedClock = Clock.fixed(Instant.parse("2018-04-29T10:15:30.00Z"),
ZoneId.of("Asia/Calcutta"));
System.out.println(fixedClock);

生成されます:

FixedClock[2018-04-29T10:15:30Z,Asia/Calcutta]

3. 結論

この記事では、Java Clock クラスと、使用可能なメソッドでそれを使用するさまざまな方法について詳しく説明します。

いつものように、コード例はGitHubから入手できます。