系列中的上一篇
当前教程
瞬时
系列中的下一篇

系列中的上一篇: 时区和偏移量

系列中的下一篇: 解析和格式化

瞬时

 

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 转换为另一个类,例如 LocalDateTimeZonedDateTime,方法是将 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 对象转换为 ZonedDateTimeOffsetDateTime 对象,需要提供时区或时区偏移量信息。

在本教程中


上次更新: 2022 年 1 月 27 日


系列中的上一篇
当前教程
瞬时
系列中的下一篇

系列中的上一篇: 时区和偏移量

系列中的下一篇: 解析和格式化