这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及后续版本中的更新语言特性摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
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
可以将ZonedDateTime或OffsetTimeZone对象转换为Instant对象,因为每个对象都映射到时间线上的确切时刻。然而,反过来则不成立。要将Instant对象转换为ZonedDateTime或OffsetDateTime对象,需要提供时区或时区偏移信息。