created: 2022-07-23T14:18:23+08:00
updated: 2022-07-23T14:27:38+08:00
tags:
- DateTimeAPI
- DateTimeAPI/Instant
Instant
The Instant Class
Date-Time API 的核心类之一是 Instant
类,它表示时间轴上一纳秒的开始。此类对于生成表示机器时间的时间戳很有用。
Instant timestamp = Instant.now();
发生在 epoch 之前的瞬间具有负值,发生在 epoch 之后的瞬间具有正值。
Instant
类提供的其他常量是 MIN,表示可能的最小(远过去)时刻,和 MAX,表示最大(远将来)时刻。
在 Instant
上调用 toString()
会产生如下输出:
2013-05-30T23:38:23.085Z
此格式遵循用于表示日期和时间的 ISO-8601 标准。
Instant
类提供了多种操作 Instant
的方法。有 plus()
和 minus()
方法用于增加或减少时间。以下代码将当前时间增加 1 小时:
Instant oneHourLater = Instant.now().plus(1, ChronoUnit.HOURS);
有比较瞬间的方法,例如 isAfter()
和 isBefore()
。 until()
方法返回两个 Instant
对象之间存在的时间。以下代码行报告自 Java 纪元开始以来已经发生了多少秒。
long secondsFromEpoch = Instant.ofEpochSecond(0L).until(Instant.now(),
ChronoUnit.SECONDS);
Instant
类不适用于人类时间单位,例如年、月或日。如果要以这些单位执行计算,可以通过将 Instant
与时区绑定来将 Instant
转换为另一个类,例如 LocalDateTime
或 ZonedDateTime
。然后,您可以访问所需单位的值。以下代码使用 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());
result
MAY 30 2021 at 18:21
ZonedDateTime
或 OffsetDateTime
对象都可以转换为 Instant
对象,因为每个对象都映射到时间轴上的确切时刻。然而,反过来是不正确的。要将 Instant
对象转换为 ZonedDateTime
或 OffsetDateTime
对象,需要提供时区或时区偏移信息。
[[解析和格式化]]