文档

Java™教程
隐藏目录
Instant类
路径: 日期 时间
教程: 标准日历

Instant类

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().plus(1, ChronoUnit.HOURS);

还有用于比较时刻的方法,如isAfter和isBefore。until方法返回两个Instant对象之间存在多少时间。以下代码报告了自Java纪元开始以来经过了多少秒。

long secondsFromEpoch = Instant.ofEpochSecond(0L).until(Instant.now(),
                        ChronoUnit.SECONDS);

Instant类不适用于年、月或日等人类时间单位。如果要在这些单位上执行计算,可以将Instant转换为另一个类,例如LocalDateTime或ZonedDateTime,通过将Instant与时区绑定。然后可以以所需的单位访问值。以下代码使用ofInstant方法和默认时区将Instant转换为LocalDateTime对象,然后以更可读的形式打印出日期和时间:

Instant timestamp;
...
LocalDateTime ldt = LocalDateTime.ofInstant(timestamp, ZoneId.systemDefault());
System.out.printf("%s %d %d 在 %d:%d%n", ldt.getMonth(), ldt.getDayOfMonth(),
                  ldt.getYear(), ldt.getHour(), ldt.getMinute());

输出结果类似于以下内容:

五月 30 2013 在 18:21

可以将ZonedDateTimeOffsetTimeZone对象转换为Instant对象,因为每个对象都映射到时间线上的确切时刻。然而,反过来则不成立。要将Instant对象转换为ZonedDateTimeOffsetDateTime对象,需要提供时区或时区偏移信息。


上一页:时区和偏移类
下一页:解析和格式化