这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
有两种基本的表示时间的方式。一种方式是以人类的术语表示时间,称为人类时间,例如年、月、日、小时、分钟和秒。另一种方式是机器时间,以纳秒分辨率连续地测量时间沿时间线从起点(称为纪元)开始。日期时间包提供了一系列丰富的类来表示日期和时间。日期时间API中的一些类用于表示机器时间,而其他类更适合表示人类时间。
首先确定您需要的日期和时间方面,然后选择满足这些需求的类或类。在选择基于时间的类时,首先确定您是否需要表示人类时间还是机器时间。然后确定您需要表示时间的哪些方面。您需要时区吗?日期和时间?仅日期?如果需要日期,您需要月、日和年,还是其中的一个子集?
例如,您可以使用LocalDate对象来表示出生日期,因为大多数人无论身处出生城市还是国际日期变更线的另一边,都会在同一天庆祝生日。如果您正在跟踪天文时间,那么您可能希望使用LocalDateTime对象来表示出生日期和时间,或者使用ZonedDateTime,它还包括时区信息。如果您正在创建时间戳,那么您很可能希望使用Instant,它允许您将时间线上的一个瞬时点与另一个瞬时点进行比较。
下表总结了java.time包中的基于时间的类,这些类存储日期和/或时间信息,或可用于测量时间量。在列中的复选标记表示该类使用该特定类型的数据,toString输出列显示使用toString方法打印的实例。讨论位置列链接到教程中的相关页面。
类或枚举 | 年 | 月 | 日 | 小时 | 分钟 | 秒* | 时区偏移 | 时区ID | toString 输出 | 讨论位置 |
---|---|---|---|---|---|---|---|---|---|---|
Instant |
|
2013-08-20T15:16:26.355Z | Instant 类 | |||||||
LocalDate |
|
|
|
2013-08-20 | 日期类 | |||||
LocalDateTime |
|
|
|
|
|
|
2013-08-20T08:16:26.937 | 日期和时间类 | ||
ZonedDateTime |
|
|
|
|
|
|
|
|
2013-08-21T00:16:26.941+09:00[Asia/Tokyo] | 时区和偏移类 |
LocalTime |
|
|
|
08:16:26.943 | 日期和时间类 | |||||
MonthDay |
|
|
--08-20 | 日期类 | ||||||
ZonedDateTime |
|
|
|
|
|
|
|
|
2013-08-21T00:16:26.941+09:00[Asia/Tokyo] | 时区和偏移类 |
LocalTime |
|
|
|
08:16:26.943 | 日期和时间类 | |||||
MonthDay |
|
|
--08-20 | 日期类 | ||||||
OffsetTime |
|
|
|
|
08:16:26.957-07:00 | 时区和偏移类 | ||||
Duration | ** | ** | ** |
|
PT20H (20小时) | 周期和持续时间 | ||||
Period |
|
|
|
*** | *** | P10D (10天) | 周期和持续时间 |
* | 秒被捕获到纳秒精度。 |
** | 这个类不存储这些信息,但有方法以这些单位提供时间。 |
*** | 当一个Period被添加到一个ZonedDateTime时,会考虑夏令时或其他本地时间差异。 |