Clock.tick
获得一个时钟,它返回从指定时钟截断到最近出现的指定持续时间的实例。
截断的时刻将小于接近指定持续时间的实际时刻,最小的时间单位是指定的时间单位。
获得的时钟将只按照指定的持续时间进行滴答(tick
)1。
从Java
文档中找到tick
的方法签名。
public static Clock tick(Clock baseClock, Duration tickDuration)
其中,baseClock
是滴答时钟所依据的基础时钟。tickDuration
是每个可见刻度的持续时间。
滴答持续时间不能是负值或空值。
对于1
毫秒的持续时间,我们可以使用tickMillis
,对于1
秒的持续时间,我们可以使用tickSeconds
,对于1
分钟的持续时间,我们可以使用时钟的tickMinutes
方法。
以毫秒为单位
当持续时间超过 100
毫秒到 tick
方法时,Clock
的 instant()
方法会将当前时刻截断到最近出现的 100
毫秒持续时间。
截断的瞬间将始终小于基本瞬间。
DurationInMillis.java
import java.time.Clock;
import java.time.Duration;
public class DurationInMillis {
public static void main(String[] args) {
Clock baseClock = Clock.systemDefaultZone();
Clock tickClock = Clock.tick(baseClock, Duration.ofMillis((100)));
for (int i = 1; i <= 3; i++) {
System.out.println("-----" + i + "-----");
System.out.println("Base: " + baseClock.instant());
System.out.println("Tick: " + tickClock.instant());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出
-----1-----
Base: 2021-06-13T08:18:39.319Z
Tick: 2021-06-13T08:18:39.300Z
-----2-----
Base: 2021-06-13T08:18:41.336Z
Tick: 2021-06-13T08:18:41.300Z
-----3-----
Base: 2021-06-13T08:18:43.351Z
Tick: 2021-06-13T08:18:43.300Z
我们可以看到,tick 获得的时钟瞬间被截断为 100
毫秒的持续时间,即 300
毫秒。
最小时间单位为毫秒。
下一次时钟滴答将在 100
毫秒后发生,直到那时瞬间不会改变。
假设我们传递了 1
毫秒的持续时间。
Clock clock = Clock.tick(Clock.system(zoneId), Duration.ofMillis(1));
我们可以改用 tickMillis
方法。
Clock clock = Clock.tickMillis(zoneId);
以秒为单位
当持续时间超过 10
秒到tick
方法时,时钟会将当前瞬间截断到最接近的 10
秒持续时间,最小时间单位为秒。
我们将得到比基本瞬间更短的截断瞬间。
下一个时钟滴答将在 10
秒后发生,直到那时瞬间不会改变。
DurationInSeconds.java
import java.time.Clock;
import java.time.Duration;
public class DurationInSeconds {
public static void main(String[] args) {
Clock baseClock = Clock.systemDefaultZone();
Clock tickClock = Clock.tick(baseClock, Duration.ofSeconds((10)));
for (int i = 1; i <= 3; i++) {
System.out.println("-----" + i + "-----");
System.out.println("Base: " + baseClock.instant());
System.out.println("Tick: " + tickClock.instant());
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出
-----1-----
Base: 2021-06-13T08:25:06.713Z
Tick: 2021-06-13T08:25:00Z
-----2-----
Base: 2021-06-13T08:25:14.737Z
Tick: 2021-06-13T08:25:10Z
-----3-----
Base: 2021-06-13T08:25:22.742Z
Tick: 2021-06-13T08:25:20Z
假设我们传递了 1
秒的持续时间。
Clock clock = Clock.tick(Clock.system(zoneId), Duration.ofSeconds(1));
我们可以改用 tickSeconds
方法。
Clock clock = Clock.tickSeconds(zoneId);
以分钟为单位
当持续时间超过 5
分钟到tick
方法时,时钟会将当前瞬间截断到最接近的 5
分钟持续时间,最小时间单位为分钟。
我们将得到比基本瞬间更短的截断瞬间。
下一个时钟滴答将在 5
分钟后发生,直到那时瞬间不会改变。
DurationInMinutes.java
import java.time.Clock;
import java.time.Duration;
public class DurationInMinutes {
public static void main(String[] args) {
Clock baseClock = Clock.systemDefaultZone();
Clock tickClock = Clock.tick(baseClock, Duration.ofMinutes((5)));
for (int i = 1; i <= 3; i++) {
System.out.println("-----" + i + "-----");
System.out.println("Base: " + baseClock.instant());
System.out.println("Tick: " + tickClock.instant());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出
-----1-----
Base: 2021-06-13T08:29:29.096Z
Tick: 2021-06-13T08:25:00Z
-----2-----
Base: 2021-06-13T08:29:31.115Z
Tick: 2021-06-13T08:25:00Z
-----3-----
Base: 2021-06-13T08:29:33.129Z
Tick: 2021-06-13T08:25:00Z
假设我们传递了 1
分钟的持续时间。
Clock clock = Clock.tick(Clock.system(zoneId), Duration.ofMinutes(1));
我们可以改用 tickMinutes
方法。
Clock clock = Clock.tickMinutes(zoneId);
以小时为单位
当持续时间超过 2
小时到tick
方法时,时钟会将当前瞬间截断到最接近的 2
小时持续时间,最小时间单位为小时。
我们将得到比基本瞬间更短的截断瞬间。
下一个时钟滴答将在 2
小时后发生,直到那时瞬间不会改变。
DurationInHours.java
import java.time.Clock;
import java.time.Duration;
public class DurationInHours {
public static void main(String[] args) {
Clock baseClock = Clock.systemDefaultZone();
Clock tickClock = Clock.tick(baseClock, Duration.ofHours((2)));
for (int i = 1; i <= 3; i++) {
System.out.println("-----" + i + "-----");
System.out.println("Base: " + baseClock.instant());
System.out.println("Tick: " + tickClock.instant());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出
-----1-----
Base: 2021-06-13T08:31:51.377Z
Tick: 2021-06-13T08:00:00Z
-----2-----
Base: 2021-06-13T08:31:53.400Z
Tick: 2021-06-13T08:00:00Z
-----3-----
Base: 2021-06-13T08:31:55.412Z
Tick: 2021-06-13T08:00:00Z
参考文献
【1】Java Doc: Class Clock
【2】Java Clock 详解
【3】Java Clock tick Method
tick
翻译为滴答,指时钟跳动的声音,形容时间跳动的最小间隔。 ↩︎