模块 java.base
 java.time

类 Clock

java.lang.Object
java.time.Clock
所有已实现的接口:
InstantSource

public abstract class Clock extends Object implements 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
参见:
  • 构造方法总结

    构造方法
    修饰符
    构造方法
    描述
    protected
    子类可访问的构造方法。
  • 方法总结

    修饰符和类型
    方法
    描述
    boolean
    equals(Object obj)
    检查此时钟是否等于另一个时钟。
    static Clock
    fixed(Instant fixedInstant, ZoneId zone)
    获得始终返回同一时刻的时钟。
    abstract ZoneId
    获取用于创建日期和时间的时区。
    int
    此时钟的哈希码。
    abstract Instant
    获取时钟的当前时刻。
    long
    获取时钟的当前毫秒时刻。
    static Clock
    offset(Clock baseClock, Duration offsetDuration)
    获得一个时钟,该时钟从指定的时钟返回瞬间,并添加了指定的持续时间。
    static Clock
    system(ZoneId zone)
    使用最佳可用系统时钟获取返回当前时刻的时钟。
    static Clock
    获得一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用默认时区转换为日期和时间。
    static Clock
    获取一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用 UTC 时区转换为日期和时间。
    static Clock
    tick(Clock baseClock, Duration tickDuration)
    获得一个时钟,该时钟返回从指定时钟截断到指定持续时间的最近一次出现的瞬间。
    static Clock
    获得一个时钟,该时钟使用最佳可用系统时钟以整毫秒返回当前的即时滴答声。
    static Clock
    获得一个时钟,该时钟使用最佳可用系统时钟以整分钟返回当前即时滴答声。
    static Clock
    使用最佳可用系统时钟获取一个时钟,该时钟以整秒为单位返回当前即时滴答声。
    abstract Clock
    返回具有不同时区的此时钟的副本。

    在类 java.lang.Object 中声明的方法

    clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
  • 构造方法详细信息

    • Clock

      protected Clock()
      子类可访问的构造方法。
  • 方法详情

    • systemUTC

      public static Clock  systemUTC()
      获取一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用 UTC 时区转换为日期和时间。

      当您需要没有日期或时间的当前时刻时,应使用此时钟,而不是 systemDefaultZone()

      该时钟基于最佳可用系统时钟。这可能会使用 System.currentTimeMillis() 或更高分辨率的时钟(如果可用)。

      从即时到日期或时间的转换使用 UTC 时区

      返回的实现是不可变的、线程安全的和 Serializable 。它相当于 system(ZoneOffset.UTC)

      返回:
      使用 UTC 区域中最佳可用系统时钟的时钟,不为空
    • systemDefaultZone

      public static Clock  systemDefaultZone()
      获得一个时钟,该时钟使用最佳可用系统时钟返回当前时刻,并使用默认时区转换为日期和时间。

      该时钟基于最佳可用系统时钟。这可能会使用 System.currentTimeMillis() 或更高分辨率的时钟(如果可用)。

      使用此方法将对默认时区的依赖性硬编码到您的应用程序中。建议避免这种情况并尽可能使用特定时区。当您需要没有日期或时间的当前时刻时,应使用 UTC clock

      返回的实现是不可变的、线程安全的和 Serializable 。它相当于 system(ZoneId.systemDefault())

      返回:
      使用默认区域中最佳可用系统时钟的时钟,不为空
      参见:
    • system

      public static Clock  system(ZoneId  zone)
      使用最佳可用系统时钟获取返回当前时刻的时钟。

      该时钟基于最佳可用系统时钟。这可能会使用 System.currentTimeMillis() 或更高分辨率的时钟(如果可用)。

      从即时到日期或时间的转换使用指定的时区。

      返回的实现是不可变的、线程安全的和 Serializable

      参数:
      zone - 用于将即时转换为日期时间的时区,不为空
      返回:
      使用指定区域中最佳可用系统时钟的时钟,不为空
    • tickMillis

      public static Clock  tickMillis(ZoneId  zone)
      获得一个时钟,该时钟使用最佳可用系统时钟以整毫秒返回当前的即时滴答声。

      该时钟将始终将纳秒级字段截断为毫秒。这确保可见时间以整毫秒计。底层时钟是最佳可用系统时钟,相当于使用 system(ZoneId)

      出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的毫秒开始时间可能会晚于通过底层时钟直接观察到的毫秒开始时间。

      返回的实现是不可变的、线程安全的和 Serializable 。它相当于 tick(system(zone), Duration.ofMillis(1))

      参数:
      zone - 用于将即时转换为日期时间的时区,不为空
      返回:
      使用指定区域以整毫秒滴答的时钟,不为空
      自从:
      9
    • tickSeconds

      public static Clock  tickSeconds(ZoneId  zone)
      使用最佳可用系统时钟获取一个时钟,该时钟以整秒为单位返回当前即时滴答声。

      该时钟将始终将纳秒级字段设置为零。这确保可见时间以整秒计。底层时钟是最佳可用系统时钟,相当于使用 system(ZoneId)

      出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的秒的开始可能会晚于通过底层时钟直接观察到的秒的开始。

      返回的实现是不可变的、线程安全的和 Serializable 。它相当于 tick(system(zone), Duration.ofSeconds(1))

      参数:
      zone - 用于将即时转换为日期时间的时区,不为空
      返回:
      使用指定区域在整秒内滴答作响的时钟,不为空
    • tickMinutes

      public static Clock  tickMinutes(ZoneId  zone)
      获得一个时钟,该时钟使用最佳可用系统时钟以整分钟返回当前即时滴答声。

      该时钟将始终将纳秒和秒字段设置为零。这确保可见时间以整分钟计。底层时钟是最佳可用系统时钟,相当于使用 system(ZoneId)

      出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的分钟开始时间可能会晚于通过底层时钟直接观察到的分钟开始时间。

      返回的实现是不可变的、线程安全的和 Serializable 。它相当于 tick(system(zone), Duration.ofMinutes(1))

      参数:
      zone - 用于将即时转换为日期时间的时区,不为空
      返回:
      使用指定区域在整分钟内滴答作响的时钟,不为空
    • tick

      public static Clock  tick(Clock  baseClock, Duration  tickDuration)
      获得一个时钟,该时钟返回从指定时钟截断到指定持续时间的最近一次出现的瞬间。

      这个时钟只会按照指定的持续时间滴答作响。因此,如果持续时间是半秒,时钟将返回截断到半秒的瞬间。

      滴答持续时间必须为正。如果它有小于整毫秒的部分,那么整个持续时间必须分成一秒,不留余数。所有正常的滴答持续时间都将符合这些标准,包括小时、分钟、秒和毫秒的任何倍数,以及合理的纳秒持续时间,例如 20ns、250,000ns 和 500,000ns。

      零或一纳秒的持续时间将没有截断效果。传递其中之一将返回底层时钟。

      出于性能原因,实现可能会使用缓存策略。因此,通过该时钟观察到的请求持续时间的开始可能会晚于通过底层时钟直接观察到的请求持续时间的开始。

      返回的实现是不可变的、线程安全的,并且 Serializable 前提是基本时钟是。

      参数:
      baseClock - 滴答时钟基于的基本时钟,不为空
      tickDuration - 每个可见刻度的持续时间,不为负,不为空
      返回:
      以整个持续时间为单位滴答作响的时钟,不为空
      抛出:
      IllegalArgumentException - 如果持续时间为负数,或者有一部分小于整毫秒,使得整个持续时间不能整除为一秒
      ArithmeticException - 如果持续时间太大而无法表示为纳米
    • fixed

      public static Clock  fixed(Instant  fixedInstant, ZoneId  zone)
      获得始终返回同一时刻的时钟。

      这个时钟只是返回指定的时刻。因此,它不是传统意义上的时钟。主要用例是在测试中,固定时钟确保测试不依赖于当前时钟。

      返回的实现是不可变的、线程安全的和 Serializable

      参数:
      fixedInstant - 用作时钟的时刻,不为空
      zone - 用于将即时转换为日期时间的时区,不为空
      返回:
      总是返回同一时刻的时钟,不为空
    • offset

      public static Clock  offset(Clock  baseClock, Duration  offsetDuration)
      获得一个时钟,该时钟从指定的时钟返回瞬间,并添加了指定的持续时间。

      此时钟包装另一个时钟,返回指定持续时间之后的瞬间。如果持续时间为负,则时刻将早于当前日期和时间。主要用例是模拟未来或过去的跑步。

      持续时间为零不会产生抵消效果。传递零将返回底层时钟。

      返回的实现是不可变的、线程安全的,并且 Serializable 前提是基本时钟是。

      参数:
      baseClock - 添加持续时间的基本时钟,不为空
      offsetDuration - 添加的持续时间,不为空
      返回:
      基于基本时钟的时钟,添加了持续时间,不为空
    • getZone

      public abstract ZoneId  getZone()
      获取用于创建日期和时间的时区。

      时钟通常会获取当前时刻,然后使用时区将其转换为日期或时间。此方法返回使用的时区。

      返回:
      用于解释瞬间的时区,不为空
    • withZone

      public abstract Clock  withZone(ZoneId  zone)
      返回具有不同时区的此时钟的副本。

      时钟通常会获取当前时刻,然后使用时区将其转换为日期或时间。此方法返回具有相似属性但使用不同时区的时钟。

      指定者:
      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

      public abstract Instant  instant()
      获取时钟的当前时刻。

      这将返回一个代表时钟定义的当前时刻的时刻。

      指定者:
      instant 在接口 InstantSource
      返回:
      此时钟的当前时刻,不为空
      抛出:
      DateTimeException - 如果无法获得瞬间,大多数实现不会抛出
    • equals

      public boolean equals(Object  obj)
      检查此时钟是否等于另一个时钟。

      时钟应该覆盖此方法以根据它们的状态比较相等并满足 Object.equals(java.lang.Object) 的合同。如果未被覆盖,则行为由 Object.equals(java.lang.Object) 定义

      重写:
      equals 在类 Object
      参数:
      obj - 要检查的对象,null 返回 false
      返回:
      如果这等于另一个时钟,则为真
      参见:
    • hashCode

      public int hashCode()
      此时钟的哈希码。

      时钟应根据其状态覆盖此方法并满足 Object.hashCode() 的约定。如果未被覆盖,则行为由 Object.hashCode() 定义

      重写:
      hashCode 在类 Object
      返回:
      合适的哈希码
      参见: