文档

Java™ 教程-Java Tutorials 中文版
Instant 类
Trail: Date Time
Lesson: Standard Calendar

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 的方法。有 plusminus 方法用于添加或减去时间。以下代码将当前时间增加 1 小时:

Instant oneHourLater = Instant.now().plusHours(1);

有比较瞬间的方法,例如 isAfterisBeforeuntil 方法返回两个 Instant 对象之间存在的时间。以下代码行报告自 Java 纪元开始以来已经发生了多少秒。

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

Instant 类不适用于人类时间单位,例如年,月或日。如果要在这些单位中执行计算,可以通过绑定 Instant 和时区将 Instant 转换为其他类,例如 LocalDateTimeZonedDateTime。然后,你可以按所需的单位访问该值。以下代码使用 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 2013 at 18:21

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


Previous page: Time Zone and Offset Classes
Next page: Parsing and Formatting