1概要

このチュートリアルでは、

java.time

パッケージからJavaの

Clock

クラスを調べます** 。

Clock

クラスとは何か、またその使用方法について説明します。


2

Clock

クラス


Clock

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

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

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


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.

システム()

この静的メソッドは、指定されたタイムゾーン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);

上記の行は、次のような結果になります(デフォルトのタイムゾーンが “Asia/Calcutta”であると仮定します)。

SystemClock[Asia/Calcutta]----

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

[source,text,gutter:,true]

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

====  2.5.  __millis()__

このメソッドは、現在の時刻をミリ秒単位で返します。

オブジェクトの作成が受け入れられないような高性能のユースケースでクロックを使用できるようにするために** 提供されています。このメソッドは、以前は__System.currentTimeInMillis()__を使用していた場所で使用できます。

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

1523104441258

====  2.6.  __オフセット()__

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

期間が負の場合、結果として得られるクロックの瞬間は与えられたベースクロックより早くなります。

**  __offset__を使うと、与えられた基本クロックの過去と未来の瞬間を取得することができます。

[source,java,gutter:,true]

Clock baseClock = Clock.systemDefaultZone();
Clock clock = Clock.offset(baseClock, Duration.ofHours(72));
System.out.println(clock5.instant());
clock = Clock.offset(baseClock, Duration.ZERO);
System.out.println(clock.instant());
clock = Clock.offset(baseClock, Duration.ofHours(-72));
System.out.println(clock.instant());

生成されます:

[source,text,gutter:,true]

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

====  2.7.  __tick()__

この静的メソッドは、指定されたクロック** から、指定された期間** の最も近い出現回数に丸めた時刻を返します。指定されたクロック期間は正である必要があります。

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

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

====  2.8.  __tickSeconds()__

この静的メソッドは、指定されたタイムゾーンの現在の瞬間ティックを秒単位で返します。この時計は__nano-of-second__フィールドを常に0に設定します。

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

2018-04-07T17:40:23Z

__tick()__を使用しても同じことが実現できます。

[source,java,gutter:,true]

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

====  2.9.  __tickMinutes()__

この静的メソッドは、指定されたタイムゾーンについて、1分ごとに経過した時刻を返します。この時計は、常に__nano-of-second__フィールドと__second-of-minute__フィールドをゼロに設定します。

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

2018-04-07T17:26:00Z

__tick()__を使用しても同じことが実現できます。

[source,java,gutter:,true]

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

====  2.10.  __withZone()__

このメソッドは、この時計のコピーを別のタイムゾーンで返します。

特定のタイムゾーンのクロックインスタンスがある場合は、異なるタイムゾーンのそのクロックのコピーを作成できます。

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

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

====  2.11.  __getZone()__

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

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

Asia/Calcutta

====  __2.12. 一定()__

このメソッドは、常に同じ時刻を返す時計を返します。この方法の主な使用例はテストです。この場合、固定クロックにより、テストは現在のクロックに依存しません。

[source,java,gutter:,true]

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

生成されます:

[source,text,gutter:,true]

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


3結論

この記事では、Javaの

Clock

クラスと、それを使用可能なメソッドで使用できるさまざまな方法について調べました。

いつものように、コード例はhttps://github.com/eugenp/tutorials/tree/master/core-java[GitHubで利用可能]にあります。