擬似時計クラスの動作確認改訂版

Dev/Java
Java

更新日時 : 2020/12/25 12:35
投稿日時 : 2020/12/25 12:32

バッチなどに用いる擬似的な時計を設定したい2

前回のプログラムをTimerを使わずに簡潔にできそうと思って、修正してみた。

前回同様、ステートフルなMockTimeクラスをまず作成する。
コンストラクタ作成時に現在時刻を設定し、メソッドは呼び出し時の時刻との差分を返す。

public class MockTime {
    private final long start;


    public MockTime() {
        this.start = System.currentTimeMillis();
    }

    public long duration() {
        return System.currentTimeMillis() - start;
    }
}

動作確認用のメインクラス。変更した箇所は、

  1. MockTimeのインスタンス生成。
  2. MockTime.duration()を呼んで、差分取得。
public static void main(String[] args) throws InterruptedException {
        // ゾーン指定(Asia/Tokyo)
        ZoneId zoneId = ZoneId.systemDefault();
        // 日付と時刻指定
        ZonedDateTime zonedDateTime = ZonedDateTime.of(2017, 6, 27, 22, 0, 0, 0, zoneId);
        // 指定したTimeゾーンと時刻でClockクラスのインスタンス生成
        Clock clock = Clock.fixed(zonedDateTime.toInstant(), zoneId);
        MockTime mockTime = new MockTime();
        for (int i = 0; i < 1000; i++) {
            System.out.println("current time:" + LocalDateTime.now(Clock.offset(clock, Duration.ofSeconds(mockTime.duration()))).
                    format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
            Thread.sleep(10);
        }
    }

実行結果

current time:2017-06-28T01:05:44
current time:2017-06-28T01:05:56
current time:2017-06-28T01:06:08
current time:2017-06-28T01:06:20
current time:2017-06-28T01:06:30
current time:2017-06-28T01:06:41

Process finished with exit code 0

まとめ

Timer使わずとも、時刻差分で実装できた。それっぽく時計を進めているだけなので、注意(再掲)。最初からそうしておけよ感。

リポジトリ

https://github.com/vagivagi/demo-clock