Java Clockクラスの手引き

Java Clockクラスのガイド

1. 概要

このチュートリアルでは、look into the Java Clock class from the java.time packageに進みます。 Clockクラスとは何か、およびその使用方法について説明します。

2. Clockクラス

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

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

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

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

  • offset(Clock, Duration)は、指定されたDurationによってオフセットされたクロックを返します。 これの主な使用例は、将来または過去の実行をシミュレートすることです

  • systemUTC() – は、UTCタイムゾーンを表す時計を返します

  • fixed(Instant, ZoneId) – は常に同じInstantを返します。 これの主なユースケースはテストです。固定クロックにより、テストが現在のクロックに依存しないことが保証されます。

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

2.1. instant()

このメソッドは、クロックで定義された現在のインスタントを表すインスタントを返します。

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()

このメソッドは、クロックの現在のインスタントをミリ秒単位で返します。 to allow the use of the clock in high-performance use cases where the creation of an object would be unacceptableが提供されます。 この方法は、他の方法ではSystem.currentTimeInMillis()を使用していた場所で使用できます。

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

生成されます:

1523104441258

2.6. offset()

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

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

Using offset, we can get instants in the past and future of the given base clock.ゼロの期間を渡すと、指定された基本クロックと同じクロックが得られます。

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()

この静的メソッドは、指定されたクロックrounded to the nearest occurrence of the specified durationからインスタントを返します。 指定されたクロック持続時間は正でなければなりません:

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. 修繕()

このメソッドは、always returns the same instantのクロックを返します。 この方法の主な使用例はテストです。固定クロックにより、テストが現在のクロックに依存しないことが保証されます。

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. 結論

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

いつものように、コード例は利用可能なover on GitHubです。