# 即时班

> 原文： [https://docs.oracle.com/javase/tutorial/datetime/iso/instant.html](https://docs.oracle.com/javase/tutorial/datetime/iso/instant.html)

Date-Time API 的核心类之一是 [`Instant`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html)类，它代表时间轴上纳秒的开始。此类对于生成表示机器时间的时间戳非常有用。

```
import java.time.Instant;

Instant timestamp = Instant.now();

```

从 `Instant` 类返回的值计算从 1970 年 1 月 1 日的第一秒开始的时间（ `1970-01-01T00：00：00Z` ）也称为 [`] EPOCH`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#EPOCH)。在纪元之前发生的瞬间具有负值，并且在该纪元之后发生的瞬间具有正值。

`Instant` 类提供的其他常数是 [`MIN`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#MIN)，表示可能的最小（远远过去）瞬间， [`MAX`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#MAX)，代表最大（远期）的瞬间。

在 `Instant` 上调用 `toString` 会产生如下输出：

```
2013-05-30T23:38:23.085Z

```

此格式遵循 [ISO-8601](http://www.iso.org/iso/home/standards/iso8601.htm) 标准来表示日期和时间。

`Instant` 类提供了多种操作 `Instant` 的方法。有`加`和`减去`方法来增加或减去时间。以下代码将当前时间增加 1 小时：

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

```

有比较瞬间的方法，例如 [`是`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#isAfter-java.time.Instant-) 和 [`之前是`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#isBefore-java.time.Instant-) 。 [`直到`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#until-java.time.temporal.Temporal-java.time.temporal.TemporalUnit-) 方法返回两个 `Instant` 对象之间存在多少时间。以下代码行报告自 Java 纪元开始以来已经发生了多少秒。

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

```

`Instant` 类不适用于人类时间单位，例如年，月或日。如果你想以这些单位进行计算，可以通过绑定`瞬间将 `Instant` 转换为另一个类，例如 `LocalDateTime` 或 `ZonedDateTime` `带有时区。然后，您可以按所需的单位访问该值。以下代码使用 [](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-) 方法的 [`和默认时区将 `Instant` 转换为 `LocalDateTime` 对象，然后打印出日期和时间以更易读的形式：`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-)

```
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

```

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