【Java 8 新特性】Java Clock tick() 设置时间最小跳动间隔

102 篇文章 73 订阅

Clock.tick获得一个时钟,它返回从指定时钟截断到最近出现的指定持续时间的实例。

截断的时刻将小于接近指定持续时间的实际时刻,最小的时间单位是指定的时间单位。

获得的时钟将只按照指定的持续时间进行滴答(tick)1

Java文档中找到tick的方法签名。

public static Clock tick(Clock baseClock, Duration tickDuration) 

其中,baseClock是滴答时钟所依据的基础时钟。tickDuration是每个可见刻度的持续时间。

滴答持续时间不能是负值或空值。

对于1毫秒的持续时间,我们可以使用tickMillis,对于1秒的持续时间,我们可以使用tickSeconds,对于1分钟的持续时间,我们可以使用时钟的tickMinutes方法。

以毫秒为单位

当持续时间超过 100 毫秒到 tick 方法时,Clockinstant() 方法会将当前时刻截断到最近出现的 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


  1. tick翻译为滴答,指时钟跳动的声音,形容时间跳动的最小间隔。 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值