Java Clock类– java.time.Clock

时间:2020-02-23 14:36:27  来源:igfitidea点击:

Java Clock类是Date Time API的一部分。
Java Clock类用于获取带有时区的当前实例,日期和时间。

Java Clock类

  • Java Clock类位于java.time包中。

  • Java Clock是一个抽象类,因此我们无法实例化它。
    但是,它包含几种获取实例的静态方法。

  • Java Clock类的用法是可选的,因为大多数Date API类都具有now()方法。
    它的主要目的是允许在需要时插入备用时钟。
    例如在Spring Dependency Injection中。

最佳实践是将Clock作为参数传递给需要当前时刻的方法。

  • 可以使用时钟代替" System.currentTimeMillis()"和" TimeZone.getDefault()"。

  • Java提供了Clock的四种实现-" FixedClock"," OffsetClock"," SystemClock"和" TickClock"。
    它们是Clock类的一部分,并且有静态方法返回这些Clock实现。

Java Clock方法

让我们看一下Clock类的静态方法及其用法。

systemDefaultZone()

Clock systemDefaultZone()方法返回带有系统默认时区的Clock实例。

public class MySpringBean {
  @Autowired
  private Clock clock; 
}

瞬间()

此方法返回时钟的当前时刻。

Clock clock = Clock.systemDefaultZone();
System.out.println(clock.getZone()); //prints "Asia/Kolkata" for me

systemUTC()

此方法返回带有UTC时区的Clock实例。

Instant instant = clock.instant();
System.out.println(instant); //prints "2016-05-08T17:51:09.102302Z"

系统(ZoneId区域)

此方法用于获取具有指定时区的Clock实例。

clock = Clock.systemUTC();
System.out.println(clock.getZone()); //prints "Z"

millis()

此方法返回实例的当前毫秒数。
等同于" System.currentTimeMillis()"。

Clock clock = Clock.system(ZoneId.of("Europe/Paris"));
System.out.println(clock.instant()); //prints "2016-05-08T17:51:09.116133Z"

offset(Clock baseClock,持续时间offsetDuration)

此方法用于获取将实例添加到给定基本时钟的Clock。
我们可以使用它来模拟将来和过去的时间测试。

System.out.println(clock.millis()); //prints 1525801869116
System.out.println(System.currentTimeMillis()); //prints 1525801869116

tick(时钟baseClock,持续时间tickDuration)

此方法返回Clock,该Clock返回从指定的基本时钟截断到指定持续时间的最接近值的瞬间。
让我们用示例代码片段来查看它的用法。

Clock pastClock = Clock.offset(clock, Duration.ofMillis(-10000));
System.out.println(clock.millis() - pastClock.millis()); //prints 10000

Clock futureClock = Clock.offset(clock, Duration.ofDays(1));
System.out.println(futureClock.millis() - clock.millis()); //prints 86400000

上面的代码片段的输出:

Clock nearestHourClock = Clock.tick(clock, Duration.ofHours(1));
System.out.println(clock.instant());
System.out.println(nearestHourClock.instant());
		
Clock nearestSecondClock = Clock.tickSeconds(ZoneId.systemDefault());
System.out.println(nearestSecondClock);
System.out.println(nearestSecondClock.instant());

注意" TickClock"和" SystemClock"实例的用法。

固定(即时fixedInstant,ZoneId区域)

此方法返回一个Clock,该Clock始终返回同一时刻。

2016-05-08T17:51:09.116566Z
2016-05-08T17:00:00Z
TickClock[SystemClock[Asia/Kolkata],PT1S]
2016-05-08T17:51:09Z

输出:

Clock fixedClock = Clock.fixed(instant, ZoneId.systemDefault());
System.out.println(fixedClock);
System.out.println(fixedClock.instant());
Thread.sleep(1000);
System.out.println(fixedClock.instant());