public abstract class Clock extends Object
该类的实例用于查找当前时刻,可以使用存储的时区来解释当前时刻,以查找当前日期和时间。 因此,可以使用时钟代替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时间尺度要求使用UTC-SLS,但是只要记录它们的工作原理,时钟实现可以选择它们与时间尺度的准确度。 因此实际上不需要实际执行UTC-SLS转换,否则不需要知道闰秒。
实施应尽可能实现Serializable
,并且必须记录它们是否支持序列化。
System.currentTimeMillis()
。
该方法几乎不保证时钟的准确性。
需要更精确时钟的应用程序必须使用不同的外部时钟(如NTP服务器)实现此抽象类。
Modifier | Constructor and Description |
---|---|
protected |
Clock()
子类可访问的构造方法。
|
Modifier and Type | Method and Description |
---|---|
boolean |
equals(Object obj)
检查这个时钟是否等于另一个时钟。
|
static Clock |
fixed(Instant fixedInstant, ZoneId zone)
获得始终返回相同时刻的时钟。
|
abstract ZoneId |
getZone()
获取用于创建日期和时间的时区。
|
int |
hashCode()
这个时钟的哈希码。
|
abstract Instant |
instant()
获取当前的时钟瞬间。
|
long |
millis()
获取时钟的当前毫秒时间。
|
static Clock |
offset(Clock baseClock, Duration offsetDuration)
获取一个时钟,从指定的时钟周期返回时钟,并添加指定的时间
|
static Clock |
system(ZoneId zone)
获取使用最佳可用系统时钟返回当前时刻的时钟。
|
static Clock |
systemDefaultZone()
获取使用最佳可用系统时钟返回当前即时的时钟,使用默认时区转换为日期和时间。
|
static Clock |
systemUTC()
获取使用最佳可用系统时钟返回当前即时的时钟,使用UTC时区转换为日期和时间。
|
static Clock |
tick(Clock baseClock, Duration tickDuration)
获取时钟,将时钟从指定的时钟截断返回到指定持续时间的最近出现。
|
static Clock |
tickMinutes(ZoneId zone)
获取时钟,使用最佳可用系统时钟在一分钟内返回当前瞬间滴答作响。
|
static Clock |
tickSeconds(ZoneId zone)
获取时钟,使用最佳可用系统时钟在一秒钟内返回当前瞬间滴答。
|
abstract Clock |
withZone(ZoneId zone)
以不同的时区返回此时钟的副本。
|
public static Clock systemUTC()
当您需要当前即时而不用日期或时间时,应使用此时钟,而不是systemDefaultZone()
。
该时钟基于最佳可用系统时钟。 这可能使用System.currentTimeMillis()
或更高分辨率的时钟(如果有)。
从即时到日期或时间的转换使用UTC time-zone 。
返回的实现是不可变的,线程安全的和Serializable
。 相当于system(ZoneOffset.UTC)
。
public static Clock systemDefaultZone()
该时钟基于最佳可用系统时钟。 这可能使用System.currentTimeMillis()
或更高分辨率的时钟(如果有)。
使用这种方法硬编码对应用程序的默认时区的依赖。 建议避免这种情况,并尽可能使用特定的时区。 当您需要当前即时的时间时,应使用UTC clock
。
返回的实现是不可变的,线程安全的和Serializable
。 相当于system(ZoneId.systemDefault())
。
ZoneId.systemDefault()
public static Clock system(ZoneId zone)
该时钟基于最佳可用系统时钟。 这可能使用System.currentTimeMillis()
或更高分辨率的时钟(如果有)。
从即时到日期或时间的转换使用指定的时区。
返回的实现是不可变的,线程安全的和Serializable
。
zone
- 用于将即时转换为日期时间的时区,不为空
public static Clock tickSeconds(ZoneId zone)
该时钟将始终将纳秒的字段设置为零。 这可以确保可见的时间在整个秒钟内打勾。 底层时钟是最好的可用系统时钟,相当于使用system(ZoneId)
。
出于性能原因,实施可能会使用缓存策略。 因此,可能通过该时钟观察的第二秒的开始将晚于直接通过下面的时钟观察到的。
返回的实现是不可变的,线程安全的和Serializable
。 相当于tick(system(zone), Duration.ofSeconds(1))
。
zone
- 用于将即时转换为日期时间的时区,不为空
public static Clock tickMinutes(ZoneId zone)
该时钟将始终将纳秒二分之一和二分之一字段设置为零。 这确保了可见的时间在整个分钟内打勾。 底层时钟是最佳可用系统时钟,相当于使用system(ZoneId)
。
出于性能原因,实施可能会使用缓存策略。 因此,可能通过该时钟观察到的分钟的开始将晚于直接通过底层时钟观察到的分钟的开始。
返回的实现是不可变的,线程安全的和Serializable
。 相当于tick(system(zone), Duration.ofMinutes(1))
。
zone
- 用于将即时转换为日期时间的时区,不为空
public static Clock tick(Clock baseClock, Duration tickDuration)
该时钟将仅按照指定的持续时间进行选择。 因此,如果持续时间是半秒钟,则时钟将使时间截断为半秒钟。
刻度持续时间必须为正。 如果它的一部分小于一毫秒,则整个持续时间必须分成一秒而不留余数。 所有正常的刻度持续时间将与这些标准匹配,包括小时,分钟,秒和毫秒的任意倍数,以及敏感的纳秒持续时间,如20ns,250,000ns和500,000ns。
零或一纳秒的持续时间将没有截断效应。 传递其中的一个将返回底层时钟。
出于性能原因,实施可能会使用缓存策略。 因此,可能通过该时钟观察到的所请求持续时间的开始将晚于直接通过底层时钟观察到的持续时间。
返回的实现是不可变的,线程安全的, Serializable
提供基本时钟。
baseClock
- 基于时钟的启动时钟,不为空
tickDuration
- 每个可见tick的持续时间,而不是否定,不为null
IllegalArgumentException
- 如果持续时间是负数,或者部分小于整个毫秒,使得整个持续时间不能被整除为一秒
ArithmeticException
- 如果持续时间太大而不能表示为纳米
public static Clock fixed(Instant fixedInstant, ZoneId zone)
这个时钟只需返回指定的时刻。 因此,它不是常规意义上的时钟。 主要用例是测试,固定时钟确保测试不依赖于当前时钟。
返回的实现是不可变的,线程安全的和Serializable
。
fixedInstant
- 即时用作时钟,不为空
zone
- 用于将即时转换为日期时间的时区,不为空
public static Clock offset(Clock baseClock, Duration offsetDuration)
这个时钟包裹另一个时钟,返回稍后指定持续时间的时刻。 如果持续时间为负,则时间将早于当前日期和时间。 这个的主要用例是模拟未来或过去的运行。
零的持续时间将没有抵消效果。 传递零将返回底层时钟。
返回的实现是不可变的,线程安全的, Serializable
提供基本时钟。
baseClock
- 基本时钟添加持续时间,不为null
offsetDuration
- 添加的持续时间,不为null
public abstract ZoneId getZone()
时钟通常将获得当前时刻,然后使用时区将其转换为日期或时间。 此方法返回使用的时区。
public abstract Clock withZone(ZoneId zone)
时钟通常将获得当前时刻,然后使用时区将其转换为日期或时间。 此方法返回具有相似属性但使用不同时区的时钟。
zone
- 要更改的时区,不为空
public long millis()
这将返回从1970-01-01T00:00Z(UTC)测量的基于毫秒的时刻。 这相当于System.currentTimeMillis()
的定义 。
大多数应用程序应避免使用此方法,并使用Instant
在时间线上表示即时,而不是原始毫秒值。 提供这种方法以允许在高性能使用情况下使用时钟,其中创建对象将是不可接受的。
目前的默认实现方式是拨打instant()
。
DateTimeException
- 如果无法获取该时刻,大多数实现都不会抛出
public abstract Instant instant()
这将返回表示由时钟定义的当前时刻的瞬间。
DateTimeException
- 如果无法获取该时刻,大多数实现都不会抛出
public boolean equals(Object obj)
时钟应该覆盖这种方法,以根据他们的状态比较平等,并符合Object.equals(java.lang.Object)
的合同。 如果不覆盖,行为由Object.equals(java.lang.Object)
定义
equals
在类别
Object
obj
- 要检查的对象,null返回false
Object.hashCode()
, HashMap
public int hashCode()
时钟应根据其状态重写此方法,并符合Object.hashCode()
的合同。 如果不被覆盖,行为由Object.hashCode()
定义
hashCode
在
Object
Object.equals(java.lang.Object)
,
System.identityHashCode(java.lang.Object)