瞬时
Instant 类
日期时间 API 的核心类之一是 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 标准,用于表示日期和时间。
The Instant
类提供了多种用于操作 Instant
的方法。有 plus()
和 minus()
方法用于添加或减去时间。以下代码将当前时间增加 1 小时
Instant oneHourLater = Instant.now().plus(1, ChronoUnit.HOURS);
有用于比较瞬时的方法,例如 isAfter()
和 isBefore()
。The until()
方法返回两个 Instant
对象之间存在多少时间。以下代码行报告自 Java 纪元开始以来发生了多少秒。
long secondsFromEpoch = Instant.ofEpochSecond(0L).until(Instant.now(),
ChronoUnit.SECONDS);
The Instant
类不使用人类时间单位,例如年、月或日。如果您想使用这些单位执行计算,您可以将 Instant
转换为另一个类,例如 LocalDateTime
或 ZonedDateTime
,方法是将 Instant
与时区绑定。然后,您可以访问所需单位的值。以下代码使用 ofInstant()
方法和默认时区将 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 2021 at 18:21
一个 ZonedDateTime
或一个 OffsetDateTime
对象可以转换为 Instant
对象,因为每个对象都映射到时间轴上的确切时刻。但是,反过来则不行。要将 Instant
对象转换为 ZonedDateTime
或 OffsetDateTime
对象,需要提供时区或时区偏移量信息。
上次更新: 2022 年 1 月 27 日