Instant Class
Date-Time API 的核心类之一是Instant类,它表示时间轴上十亿分之一秒的开始。此类对于生成表示机器时间的时间戳很有用。
import java.time.Instant;
Instant timestamp = Instant.now();
从Instant
类返回的值计算从 1970 年 1 月 1 日的第一秒(1970\-01\-01T00:00:00Z
)开始的时间,也称为EPOCH。在纪元之前发生的瞬间具有负值,在纪元之后发生的瞬间具有正值。
Instant
类提供的其他常量是MIN,代表最小的可能(远处)瞬间,而MAX代表最大的(远处)瞬间。
在Instant
上调用toString
会产生类似以下的输出:
2013-05-30T23:38:23.085Z
此格式遵循表示日期和时间的ISO-8601标准。
Instant
类提供了各种用于处理Instant
的方法。有plus
和minus
个方法用于增加或减少时间。以下代码将当前时间增加 1 小时:
Instant oneHourLater = Instant.now().plusHours(1);
存在用于比较瞬间的方法,例如isAfter和isBefore。 until方法返回两个Instant
对象之间存在多少时间。下面的代码行报告自 Java 时代开始以来已经发生了几秒钟。
long secondsFromEpoch = Instant.ofEpochSecond(0L).until(Instant.now(),
ChronoUnit.SECONDS);
Instant
类不适用于人类的时间单位,例如年,月或日。如果要以这些单位执行计算,可以通过将Instant
与timezone绑定来将Instant
转换为另一个类,例如LocalDateTime
或ZonedDateTime
。然后,您可以以所需单位访问值。以下代码使用ofInstant方法和默认timezone将Instant
转换为LocalDateTime
对象,然后以更易读的形式打印出日期和时间:
Instant timestamp;
...
LocalDateTime ldt = LocalDateTime.ofInstant(timestamp, ZoneId.systemDefault());
System.out.printf("%s %d %d at %d:%d%n", ldt.getMonth(), ldt.getDayOfMonth(),
ldt.getYear(), ldt.getHour(), ldt.getMinute());
输出将类似于以下内容:
MAY 30 2013 at 18:21
ZonedDateTime
或OffsetTimeZone
对象都可以转换为Instant
对象,因为每个对象都 Map 到时间线上的确切 Moment。但是,事实并非如此。要将Instant
对象转换为ZonedDateTime
或OffsetDateTime
对象,需要提供timezone或timezoneoffset量信息。