擬似時計クラスの動作確認改訂版
バッチなどに用いる擬似的な時計を設定したい2
前回のプログラムをTimerを使わずに簡潔にできそうと思って、修正してみた。
前回同様、ステートフルなMockTimeクラスをまず作成する。
コンストラクタ作成時に現在時刻を設定し、メソッドは呼び出し時の時刻との差分を返す。
public class MockTime {
private final long start;
public MockTime() {
this.start = System.currentTimeMillis();
}
public long duration() {
return System.currentTimeMillis() - start;
}
}
動作確認用のメインクラス。変更した箇所は、
MockTime
のインスタンス生成。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使わずとも、時刻差分で実装できた。それっぽく時計を進めているだけなので、注意(再掲)。最初からそうしておけよ感。