模块 java.base
 java.time

接口 InstantSource

所有已知的实现类:
Clock

public interface InstantSource
提供对当前时刻的访问。

此接口的实例用于访问当前时刻的可插入表示。例如,可以使用 InstantSource 代替 System.currentTimeMillis()

这种抽象的主要目的是允许在需要时插入备用即时源。应用程序使用对象而不是静态方法来获取当前时间。这可以简化测试。

因此,此接口不保证结果实际上代表时间线上的当前时刻。相反,它允许应用程序提供关于当前时刻的受控视图。

应用程序的最佳实践是将 InstantSource 传递到需要当前时刻的任何方法中。依赖注入框架是实现这一目标的一种方法:

 public class MyBean {
  private InstantSource source; // dependency inject
  ...
  public void process(Instant endInstant) {
   if (source.instant().isAfter(endInstant) {
    ...
   }
  }
 }
 
这种方法允许在测试期间使用替代来源,例如 fixed offset

system 工厂方法提供基于最佳可用系统时钟的源。这可能会使用 System.currentTimeMillis() 或更高分辨率的时钟(如果可用)。

实现要求:
必须小心实现此接口以确保其他类正确运行。所有实现都必须是线程安全的——单个实例必须能够从多个线程调用而不会产生竞争条件等负面后果。

主要方法被定义为允许抛出异常。在正常使用中,不会抛出任何异常,但是一种可能的实现是通过网络从中央时间服务获取时间。显然,在这种情况下查找可能会失败,因此允许该方法抛出异常。

InstantSource 返回的瞬间在忽略闰秒的时间尺度上工作,如 Instant 中所述。如果实现包装了一个提供闰秒信息的源,那么应该使用一种机制来“平滑”闰秒。 Java Time-Scale 强制使用 UTC-SLS,但是实现可以选择时间尺度的准确度,只要它们记录了它们的工作方式即可。因此,实现不需要实际执行 UTC-SLS 转换或以其他方式了解闰秒。

实现应尽可能实现 Serializable,并且必须记录它们是否支持序列化。

实现注意事项:
此处提供的实现基于与 System.currentTimeMillis() 相同的底层系统时钟,但可能具有比毫秒更精细的精度(如果可用)。但是,对于底层系统时钟的准确性几乎没有提供任何保证。需要更准确的系统时钟的应用程序必须使用不同的外部系统时钟(例如 NTP 服务)自己实现此抽象类。
自从:
17
  • 方法总结

    修饰符和类型
    方法
    描述
    fixed(Instant fixedInstant)
    获取始终返回同一时刻的源。
    获取源的当前时刻。
    default long
    获取源的当前毫秒时刻。
    offset(InstantSource baseSource, Duration offsetDuration)
    获取一个源,该源从指定的源返回瞬间,并添加了指定的持续时间。
    获取使用最佳可用系统时钟返回当前时刻的源。
    tick(InstantSource baseSource, Duration tickDuration)
    获取一个源,该源返回从指定源截断到最接近的指定持续时间的瞬间。
    default Clock
    返回具有指定时区的时钟。
  • 方法详情

    • system

      static InstantSource  system()
      获取使用最佳可用系统时钟返回当前时刻的源。

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

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

      返回:
      使用最佳可用系统时钟的源,不为空
    • tick

      static InstantSource  tick(InstantSource  baseSource, Duration  tickDuration)
      获取一个源,该源返回从指定源截断到最接近的指定持续时间的瞬间。

      此来源只会按照指定的持续时间进行勾选。因此,如果持续时间为半秒,源将返回截断为半秒的瞬间。

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

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

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

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

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

      static InstantSource  fixed(Instant  fixedInstant)
      获取始终返回同一时刻的源。

      此源仅返回指定的瞬间。因此,它不是代表当前时刻的来源。主要用例是在测试中,固定源确保测试不依赖于当前源。

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

      参数:
      fixedInstant - 立即使用,不为空
      返回:
      始终返回同一时刻的源,而不是 null
    • offset

      static InstantSource  offset(InstantSource  baseSource, Duration  offsetDuration)
      获取一个源,该源从指定的源返回瞬间,并添加了指定的持续时间。

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

      持续时间为零不会产生抵消效果。传递零将返回基础源。

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

      参数:
      baseSource - 添加持续时间的基本源,不为空
      offsetDuration - 添加的持续时间,不为空
      返回:
      基于添加了持续时间的基本源的源,不为空
    • instant

      Instant  instant()
      获取源的当前时刻。

      这将返回表示源定义的当前时刻的时刻。

      返回:
      此来源的当前时刻,不为空
      抛出:
      DateTimeException - 如果无法获得瞬间,大多数实现不会抛出
    • millis

      default long millis()
      获取源的当前毫秒时刻。

      这将返回基于毫秒的瞬间,从 1970-01-01T00:00Z (UTC) 开始测量。这相当于 System.currentTimeMillis() 的定义。

      大多数应用程序应避免使用此方法并使用 Instant 来表示时间线上的一个瞬间,而不是原始的毫秒值。提供此方法是为了允许在无法创建对象的高性能用例中使用源。

      实现要求:
      默认实现调用 instant()
      返回:
      来自此源的当前毫秒时刻,从 1970-01-01T00:00Z (UTC) 的 Java 纪元开始测量,不为空
      抛出:
      DateTimeException - 如果无法获得瞬间,大多数实现不会抛出
    • withZone

      default Clock  withZone(ZoneId  zone)
      返回具有指定时区的时钟。

      这将返回一个 Clock ,它是这个接口的扩展,结合了这个源和指定的时区。

      返回的实现是不可变的、线程安全的,并且 Serializable 前提是此源是。

      实现要求:
      默认实现返回一个不可变的、线程安全的和 Clock Serializable 子类,它结合了这个源和指定的区域。
      参数:
      zone - 要使用的时区,不为空
      返回:
      基于具有指定时区的此源的时钟,不为空