広告

Java : Clock (時計) - API使用例

Clock (Java SE 21 & JDK 21) の使い方まとめです。
だいたいのメソッドを網羅済みです。
API仕様書のおともにどうぞ。


概要

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

クラス構成

Clock クラスは、現在時刻 を取得するために利用するクラスです。

単純に現在時刻を返すだけでなく、

  • 固定の時刻を返す
  • 現在時刻の xx 時間後を返す

といったことも可能です。

ユニットテストなどで

  • 現在時刻を特定の時刻にして実行したい

というケースで便利ですね。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

{
    final var now = ZonedDateTime.now();
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]
}
{
    final var clock = Clock.systemDefaultZone();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.943910300Z
}
{
    final var clock = Clock.systemUTC();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T06:09:39.945908600Z

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.945908600Z
}
{
    // 固定で 2100-12-31 00:00 を返します。
    final var dateTime = ZonedDateTime.of(2100, 12, 31, 0, 0, 0, 0, ZoneOffset.UTC);
    final var clock = Clock.fixed(dateTime.toInstant(), dateTime.getZone());

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2100-12-31T00:00Z

    final var instant = clock.instant();
    System.out.println(instant); // 2100-12-31T00:00:00Z
}

コンストラクタ

Clock ()

サブクラスでアクセスできるコンストラクタです。

protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。

メソッド

boolean equals (Object obj)

このクロックがもう一方のクロックと等しいかどうかを確認します。

final var clock1 = Clock.systemUTC();
final var clock2 = Clock.systemUTC();
final var clock3 = Clock.systemDefaultZone();

System.out.println(clock1.equals(clock2)); // true
System.out.println(clock1.equals(clock3)); // false

static Clock fixed (Instant fixedInstant, ZoneId zone)

常に同じインスタントを返すクロックを取得します。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

{
    final var now = ZonedDateTime.now();
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]
}
{
    final var clock = Clock.systemDefaultZone();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.943910300Z
}
{
    final var clock = Clock.systemUTC();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T06:09:39.945908600Z

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.945908600Z
}
{
    // 固定で 2100-12-31 00:00 を返します。
    final var dateTime = ZonedDateTime.of(2100, 12, 31, 0, 0, 0, 0, ZoneOffset.UTC);
    final var clock = Clock.fixed(dateTime.toInstant(), dateTime.getZone());

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2100-12-31T00:00Z

    final var instant = clock.instant();
    System.out.println(instant); // 2100-12-31T00:00:00Z
}

abstract ZoneId getZone ()

日付と時間を作成するために使用されるタイムゾーンを取得します。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

final var clock1 = Clock.systemDefaultZone();
System.out.println(clock1.getZone()); // Asia/Tokyo

final var clock2 = Clock.systemUTC();
System.out.println(clock2.getZone()); // Z

final var zone = ZoneId.of("America/Los_Angeles");
final var clock3 = Clock.system(zone);
System.out.println(clock3.getZone()); // America/Los_Angeles

int hashCode ()

このクロックのハッシュ・コード。

final var clock1 = Clock.systemUTC();
System.out.println(clock1.hashCode()); // 1

final var clock2 = Clock.system(ZoneId.of("America/Los_Angeles"));
System.out.println(clock2.hashCode()); // -1536188512

final var clock3 = Clock.system(ZoneId.of("Asia/Tokyo"));
System.out.println(clock3.hashCode()); // -1660747038

abstract Instant instant ()

クロックの現在の時点を取得します。

final var clock = Clock.systemUTC();

for (int i = 0; i < 4; i++) {
    final var instant = clock.instant();
    final var millis = clock.millis();

    System.out.printf("%s (millis = %d)%n", instant, millis);

    TimeUnit.SECONDS.sleep(10);
}

// 結果
// ↓
//2024-07-07T06:10:53.794095300Z (millis = 1720332653794)
//2024-07-07T06:11:03.811190700Z (millis = 1720332663811)
//2024-07-07T06:11:13.827016100Z (millis = 1720332673827)
//2024-07-07T06:11:23.841881800Z (millis = 1720332683841)

long millis ()

クロックの現在の時点をミリ秒で取得します。

final var clock = Clock.systemUTC();

for (int i = 0; i < 4; i++) {
    final var instant = clock.instant();
    final var millis = clock.millis();

    System.out.printf("%s (millis = %d)%n", instant, millis);

    TimeUnit.SECONDS.sleep(10);
}

// 結果
// ↓
//2024-07-07T06:10:53.794095300Z (millis = 1720332653794)
//2024-07-07T06:11:03.811190700Z (millis = 1720332663811)
//2024-07-07T06:11:13.827016100Z (millis = 1720332673827)
//2024-07-07T06:11:23.841881800Z (millis = 1720332683841)

static Clock offset (Clock baseClock, Duration offsetDuration)

指定されたデュレーションを加算して指定されたクロックからインスタントを返すクロックを取得します

final var instant = Instant.ofEpochSecond(4102444800L);
System.out.println(instant); // 2100-01-01T00:00:00Z

final var baseClock = Clock.fixed(instant, ZoneOffset.UTC);
System.out.println(baseClock.instant()); // 2100-01-01T00:00:00Z

final var clock1 = Clock.offset(baseClock, Duration.ofDays(-1));
System.out.println(clock1.instant()); // 2099-12-31T00:00:00Z

final var clock2 = Clock.offset(baseClock, Duration.ofHours(14).plusMinutes(30));
System.out.println(clock2.instant()); // 2100-01-01T14:30:00Z

static Clock system (ZoneId zone)

最適なシステム・クロックを使用して現在のインスタントを返すクロックを取得します。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

final var clock1 = Clock.systemDefaultZone();
System.out.println(clock1.getZone()); // Asia/Tokyo

final var clock2 = Clock.systemUTC();
System.out.println(clock2.getZone()); // Z

final var zone = ZoneId.of("America/Los_Angeles");
final var clock3 = Clock.system(zone);
System.out.println(clock3.getZone()); // America/Los_Angeles

static Clock systemDefaultZone ()

利用できる最適なシステム・クロックを使用し、デフォルト・タイムゾーンを使って日付と時間に変換した現在のインスタントを返すクロックを取得します。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

{
    final var now = ZonedDateTime.now();
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]
}
{
    final var clock = Clock.systemDefaultZone();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.943910300Z
}
{
    final var clock = Clock.systemUTC();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T06:09:39.945908600Z

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.945908600Z
}
{
    // 固定で 2100-12-31 00:00 を返します。
    final var dateTime = ZonedDateTime.of(2100, 12, 31, 0, 0, 0, 0, ZoneOffset.UTC);
    final var clock = Clock.fixed(dateTime.toInstant(), dateTime.getZone());

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2100-12-31T00:00Z

    final var instant = clock.instant();
    System.out.println(instant); // 2100-12-31T00:00:00Z
}

static Clock systemUTC ()

利用できる最適なシステム・クロックを使用し、UTCタイムゾーンを使って日付と時間に変換した現在のインスタントを返すクロックを取得します。

System.out.println(ZoneId.systemDefault()); // Asia/Tokyo

{
    final var now = ZonedDateTime.now();
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]
}
{
    final var clock = Clock.systemDefaultZone();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T15:09:39.943910300+09:00[Asia/Tokyo]

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.943910300Z
}
{
    final var clock = Clock.systemUTC();

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2024-07-07T06:09:39.945908600Z

    final var instant = clock.instant();
    System.out.println(instant); // 2024-07-07T06:09:39.945908600Z
}
{
    // 固定で 2100-12-31 00:00 を返します。
    final var dateTime = ZonedDateTime.of(2100, 12, 31, 0, 0, 0, 0, ZoneOffset.UTC);
    final var clock = Clock.fixed(dateTime.toInstant(), dateTime.getZone());

    final var now = ZonedDateTime.now(clock);
    System.out.println(now); // 2100-12-31T00:00Z

    final var instant = clock.instant();
    System.out.println(instant); // 2100-12-31T00:00:00Z
}

static Clock tick (Clock baseClock, Duration tickDuration)

指定されたデュレーションの直近値に切り捨てられたインスタントを指定されたクロックから返すクロックを取得します。

final var baseClock = Clock.systemUTC();
final var clock = Clock.tick(baseClock, Duration.ofSeconds(2));

for (int i = 0; i < 8; i++) {
    final var instant = clock.instant();
    System.out.println(instant);

    TimeUnit.SECONDS.sleep(1);
}

// 結果
// ↓
//2024-07-07T06:13:14Z
//2024-07-07T06:13:16Z
//2024-07-07T06:13:16Z
//2024-07-07T06:13:18Z
//2024-07-07T06:13:18Z
//2024-07-07T06:13:20Z
//2024-07-07T06:13:20Z
//2024-07-07T06:13:22Z

static Clock tickMillis (ZoneId zone)

利用可能な最高のシステム・クロックを使用して、現在のインスタント・ティックをミリ秒単位で返すクロックを取得します。

final var clock = Clock.tickMillis(ZoneOffset.UTC);

for (int i = 0; i < 8; i++) {
    final var instant = clock.instant();
    System.out.println(instant);

    TimeUnit.MILLISECONDS.sleep(1);
}

// 結果
// ↓
//2024-07-07T06:13:40.483Z
//2024-07-07T06:13:40.489Z
//2024-07-07T06:13:40.491Z
//2024-07-07T06:13:40.493Z
//2024-07-07T06:13:40.495Z
//2024-07-07T06:13:40.497Z
//2024-07-07T06:13:40.499Z
//2024-07-07T06:13:40.502Z

static Clock tickMinutes (ZoneId zone)

利用可能な最高のシステム・クロックを使用して、現在のインスタント・ティックを分単位で返すクロックを取得します。

final var clock = Clock.tickMinutes(ZoneOffset.UTC);

for (int i = 0; i < 4; i++) {
    final var instant = clock.instant();
    System.out.println(instant);

    TimeUnit.SECONDS.sleep(30);
}

// 結果
// ↓
//2024-07-07T06:15:00Z
//2024-07-07T06:15:00Z
//2024-07-07T06:16:00Z
//2024-07-07T06:16:00Z

static Clock tickSeconds (ZoneId zone)

最適なシステム・クロックを使用して、現在のインスタント・ティックを秒単位で返すクロックを取得します。

final var clock = Clock.tickSeconds(ZoneOffset.UTC);

for (int i = 0; i < 8; i++) {
    final var instant = clock.instant();
    System.out.println(instant);

    TimeUnit.MILLISECONDS.sleep(500);
}

// 結果
// ↓
//2024-07-07T06:18:04Z
//2024-07-07T06:18:05Z
//2024-07-07T06:18:05Z
//2024-07-07T06:18:06Z
//2024-07-07T06:18:06Z
//2024-07-07T06:18:07Z
//2024-07-07T06:18:07Z
//2024-07-07T06:18:08Z

abstract Clock withZone (ZoneId zone)

別のタイムゾーンを使って、このクロックのコピーを返します。

final var clock1 = Clock.systemUTC();
System.out.println(clock1); // SystemClock[Z]

final var zone = ZoneId.of("America/Los_Angeles");
final var clock2 = clock1.withZone(zone);
System.out.println(clock2); // SystemClock[America/Los_Angeles]
final var clock1 = Clock.tickSeconds(ZoneOffset.UTC);
System.out.println(clock1); // TickClock[SystemClock[Z],PT1S]

final var zone = ZoneId.of("Asia/Tokyo");
final var clock2 = clock1.withZone(zone);
System.out.println(clock2); // TickClock[SystemClock[Asia/Tokyo],PT1S]

関連記事

ページの先頭へ