- 所有已实现的接口:
InstantSource
这个抽象类的实例用于访问当前时刻的可插入表示,可以使用存储的时区来解释它以找到当前日期和时间。例如,可以使用 Clock 代替 System.currentTimeMillis() 和 TimeZone.getDefault() 。
Clock 的使用是可选的。所有关键的日期时间类还有一个使用默认时区系统时钟的now()工厂方法。这种抽象的主要目的是允许在需要时插入备用时钟。应用程序使用对象而不是静态方法来获取当前时间。这可以简化测试。
因此,这个抽象类不保证结果实际上代表时间线上的当前时刻。相反,它允许应用程序提供关于当前时刻和时区的受控视图。
应用程序的最佳实践是将 Clock 传递给任何需要当前时刻和时区的方法。依赖注入框架是实现这一目标的一种方法:
public class MyBean {
private Clock clock; // dependency inject
...
public void process(LocalDate eventDate) {
if (eventDate.isBefore(LocalDate.now(clock)) {
...
}
}
}
这种方法允许在测试期间使用替代时钟,例如 fixed 或 offset 。
system 工厂方法提供基于最佳可用系统时钟的时钟。这可能会使用 System.currentTimeMillis() 或更高分辨率的时钟(如果可用)。
- 实现要求:
-
必须谨慎实现此抽象类,以确保其他类正确运行。所有实现都必须是线程安全的——单个实例必须能够从多个线程调用而不会产生竞争条件等负面后果。
主要方法被定义为允许抛出异常。在正常使用中,不会抛出任何异常,但是一种可能的实现是通过网络从中央时间服务获取时间。显然,在这种情况下查找可能会失败,因此允许该方法抛出异常。
从
Clock返回的瞬间在忽略闰秒的时间尺度上工作,如Instant中所述。如果实现包装了一个提供闰秒信息的源,那么应该使用一种机制来“平滑”闰秒。 Java Time-Scale 强制使用 UTC-SLS,但是时钟实现可以选择它们与时间尺度的准确度,只要它们记录了它们的工作方式。因此,实现不需要实际执行 UTC-SLS 转换或以其他方式了解闰秒。实现应尽可能实现
Serializable,并且必须记录它们是否支持序列化。 - 自从:
- 1.8
- 参见:
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述boolean检查此时钟是否等于另一个时钟。static Clock获得始终返回同一时刻的时钟。abstract ZoneIdgetZone()获取用于创建日期和时间的时区。inthashCode()此时钟的哈希码。abstract Instantinstant()获取时钟的当前时刻。longmillis()获取时钟的当前毫秒时刻。static Clock获得一个时钟,该时钟从指定的时钟返回瞬间,并添加了指定的持续时间。static Clock使用最佳可用系统时钟获取返回当前时刻的时钟。static Clock获得一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用默认时区转换为日期和时间。static Clock获取一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用 UTC 时区转换为日期和时间。static Clock获得一个时钟,该时钟返回从指定时钟截断到指定持续时间的最近一次出现的瞬间。static ClocktickMillis(ZoneId zone) 获得一个时钟,该时钟使用最佳可用系统时钟以整毫秒返回当前的即时滴答声。static ClocktickMinutes(ZoneId zone) 获得一个时钟,该时钟使用最佳可用系统时钟以整分钟返回当前即时滴答声。static ClocktickSeconds(ZoneId zone) 使用最佳可用系统时钟获取一个时钟,该时钟以整秒为单位返回当前即时滴答声。abstract Clock返回具有不同时区的此时钟的副本。
-
构造方法详细信息
-
Clock
protected Clock()子类可访问的构造方法。
-
-
方法详情
-
systemUTC
获取一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用 UTC 时区转换为日期和时间。当您需要没有日期或时间的当前时刻时,应使用此时钟,而不是
systemDefaultZone()。该时钟基于最佳可用系统时钟。这可能会使用
System.currentTimeMillis()或更高分辨率的时钟(如果可用)。从即时到日期或时间的转换使用 UTC 时区 。
返回的实现是不可变的、线程安全的和
Serializable。它相当于system(ZoneOffset.UTC)。- 返回:
- 使用 UTC 区域中最佳可用系统时钟的时钟,不为空
-
systemDefaultZone
获得一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用默认时区转换为日期和时间。该时钟基于最佳可用系统时钟。这可能会使用
System.currentTimeMillis()或更高分辨率的时钟(如果可用)。使用此方法将对默认时区的依赖性硬编码到您的应用程序中。建议避免这种情况并尽可能使用特定时区。当您需要没有日期或时间的当前时刻时,应使用
UTC clock。返回的实现是不可变的、线程安全的和
Serializable。它相当于system(ZoneId.systemDefault())。- 返回:
- 使用默认区域中最佳可用系统时钟的时钟,不为空
- 参见:
-
system
使用最佳可用系统时钟获取返回当前时刻的时钟。该时钟基于最佳可用系统时钟。这可能会使用
System.currentTimeMillis()或更高分辨率的时钟(如果可用)。从即时到日期或时间的转换使用指定的时区。
返回的实现是不可变的、线程安全的和
Serializable。- 参数:
zone- 用于将即时转换为日期时间的时区,不为空- 返回:
- 使用指定区域中最佳可用系统时钟的时钟,不为空
-
tickMillis
获得一个时钟,该时钟使用最佳可用系统时钟以整毫秒返回当前的即时滴答声。该时钟将始终将纳秒级字段截断为毫秒。这确保可见时间以整毫秒计。底层时钟是最佳可用系统时钟,相当于使用
system(ZoneId)。出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的毫秒开始时间可能会晚于通过底层时钟直接观察到的毫秒开始时间。
返回的实现是不可变的、线程安全的和
Serializable。它相当于tick(system(zone), Duration.ofMillis(1))。- 参数:
zone- 用于将即时转换为日期时间的时区,不为空- 返回:
- 使用指定区域以整毫秒滴答的时钟,不为空
- 自从:
- 9
-
tickSeconds
使用最佳可用系统时钟获取一个时钟,该时钟以整秒为单位返回当前即时滴答声。该时钟将始终将纳秒级字段设置为零。这确保可见时间以整秒计。底层时钟是最佳可用系统时钟,相当于使用
system(ZoneId)。出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的秒的开始可能会晚于通过底层时钟直接观察到的秒的开始。
返回的实现是不可变的、线程安全的和
Serializable。它相当于tick(system(zone), Duration.ofSeconds(1))。- 参数:
zone- 用于将即时转换为日期时间的时区,不为空- 返回:
- 使用指定区域在整秒内滴答作响的时钟,不为空
-
tickMinutes
获得一个时钟,该时钟使用最佳可用系统时钟以整分钟返回当前即时滴答声。该时钟将始终将纳秒和秒字段设置为零。这确保可见时间以整分钟计。底层时钟是最佳可用系统时钟,相当于使用
system(ZoneId)。出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的分钟开始时间可能会晚于通过底层时钟直接观察到的分钟开始时间。
返回的实现是不可变的、线程安全的和
Serializable。它相当于tick(system(zone), Duration.ofMinutes(1))。- 参数:
zone- 用于将即时转换为日期时间的时区,不为空- 返回:
- 使用指定区域在整分钟内滴答作响的时钟,不为空
-
tick
获得一个时钟,该时钟返回从指定时钟截断到指定持续时间的最近一次出现的瞬间。这个时钟只会按照指定的持续时间滴答作响。因此,如果持续时间是半秒,时钟将返回截断到半秒的瞬间。
滴答持续时间必须为正。如果它有小于整毫秒的部分,那么整个持续时间必须分成一秒,不留余数。所有正常的滴答持续时间都将符合这些标准,包括小时、分钟、秒和毫秒的任何倍数,以及合理的纳秒持续时间,例如 20ns、250,000ns 和 500,000ns。
零或一纳秒的持续时间将没有截断效果。传递其中之一将返回底层时钟。
出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的请求持续时间的开始可能会晚于通过底层时钟直接观察到的请求持续时间的开始。
返回的实现是不可变的、线程安全的,并且
Serializable前提是基本时钟是。- 参数:
baseClock- 滴答时钟基于的基本时钟,不为空tickDuration- 每个可见刻度的持续时间,不为负,不为空- 返回:
- 以整个持续时间为单位滴答作响的时钟,不为空
- 抛出:
IllegalArgumentException- 如果持续时间为负数,或者有一部分小于整毫秒,使得整个持续时间不能整除为一秒ArithmeticException- 如果持续时间太大而无法表示为纳米
-
fixed
获得始终返回同一时刻的时钟。这个时钟只是返回指定的时刻。因此,它不是传统意义上的时钟。主要用例是在测试中,固定时钟确保测试不依赖于当前时钟。
返回的实现是不可变的、线程安全的和
Serializable。- 参数:
fixedInstant- 用作时钟的时刻,不为空zone- 用于将即时转换为日期时间的时区,不为空- 返回:
- 总是返回同一时刻的时钟,不为空
-
offset
获得一个时钟,该时钟从指定的时钟返回瞬间,并添加了指定的持续时间。此时钟包装另一个时钟,返回指定持续时间之后的瞬间。如果持续时间为负,则时刻将早于当前日期和时间。主要用例是模拟未来或过去的跑步。
持续时间为零不会产生抵消效果。传递零将返回底层时钟。
返回的实现是不可变的、线程安全的,并且
Serializable前提是基本时钟是。- 参数:
baseClock- 添加持续时间的基本时钟,不为空offsetDuration- 添加的持续时间,不为空- 返回:
- 基于基本时钟的时钟,添加了持续时间,不为空
-
getZone
获取用于创建日期和时间的时区。时钟通常会获取当前时刻,然后使用时区将其转换为日期或时间。此方法返回使用的时区。
- 返回:
- 用于解释瞬间的时区,不为空
-
withZone
返回具有不同时区的此时钟的副本。时钟通常会获取当前时刻,然后使用时区将其转换为日期或时间。此方法返回具有相似属性但使用不同时区的时钟。
- 指定者:
withZone在接口InstantSource中- 参数:
zone- 要更改为的时区,不为空- 返回:
- 基于具有指定时区的此时钟的时钟,不为空
-
millis
public long millis()获取时钟的当前毫秒时刻。这将返回基于毫秒的瞬间,从 1970-01-01T00:00Z (UTC) 开始测量。这相当于
System.currentTimeMillis()的定义。大多数应用程序应避免使用此方法并使用
Instant来表示时间线上的一个瞬间,而不是原始的毫秒值。提供此方法是为了允许在无法创建对象的高性能用例中使用时钟。默认实现当前调用
instant()。- 指定者:
millis在接口InstantSource中- 返回:
- 此时钟的当前毫秒时刻,从 1970-01-01T00:00Z (UTC) 的 Java 纪元开始测量,不为空
- 抛出:
DateTimeException- 如果无法获得瞬间,大多数实现不会抛出
-
instant
获取时钟的当前时刻。这将返回一个代表时钟定义的当前时刻的时刻。
- 指定者:
instant在接口InstantSource中- 返回:
- 此时钟的当前时刻,不为空
- 抛出:
DateTimeException- 如果无法获得瞬间,大多数实现不会抛出
-
equals
检查此时钟是否等于另一个时钟。时钟应该覆盖此方法以根据它们的状态比较相等并满足
Object.equals(java.lang.Object)的合同。如果未被覆盖,则行为由Object.equals(java.lang.Object)定义 -
hashCode
public int hashCode()此时钟的哈希码。时钟应根据其状态覆盖此方法并满足
Object.hashCode()的约定。如果未被覆盖,则行为由Object.hashCode()定义
-