Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
表示时间有两种基本方法。一种方式表示人类时间,称为 human time (人类时间),例如年,月,日,小时,分钟和秒。另一种方式,machine time (机器时间),沿着来自原点,称为 epoch (时期),的时间线连续测量时间,以纳秒为分辨率。Date-Time 包提供了丰富的类数组,用于表示日期和时间。Date-Time API 中的某些类用于表示机器时间,而其他类更适合表示人类时间。
首先确定你需要的日期和时间的哪些方面,然后选择满足这些需求的一个或多个类。在选择基于时间的类时,首先要决定是需要表示人类时间还是机器时间。然后,你可以确定需要表示的时间方面。你需要一个时区吗?日期 和 时间?仅限日期?如果你需要日期,你需要月,日,和 年,还是需要一个子集?
例如,你可以使用 LocalDate 对象来表示出生日期,因为大多数人在同一天观察他们的生日,无论他们是在出生城市还是在国际日期行的另一侧的全球各地。如果你正在跟踪占星时间,那么你可能希望使用 LocalDateTime 对象来表示出生日期和时间,或者使用 ZonedDateTime,其中还包括时区。如果你正在创建时间戳,那么你很可能希望使用 Instant,它允许你将时间线上的一个瞬时点与另一个瞬时点进行比较。
下表总结了存储日期和/或时间信息的 java.time 包中基于时间的类,或者可用于测量时间量的类。列中的复选标记表示该类使用该特定类型的数据,toString Output 列显示使用 toString 方法打印的实例。Where Discussed 列链接到教程中的相关页面。
类或枚举 | Year | Month | Day | 时 | 分 | 秒* | 时区偏移 | 时区 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 | 日期类 | ||||||
Year |
|
2013 | 日期类 | |||||||
YearMonth |
|
|
2013-08 | 日期类 | ||||||
Month |
|
AUGUST | DayOfWeek 和 Month 枚举 | |||||||
OffsetDateTime |
|
|
|
|
|
|
|
2013-08-20T08:16:26.954-07:00 | 时区和偏移类 | |
OffsetTime |
|
|
|
|
08:16:26.957-07:00 | 时区和偏移类 | ||||
Duration | ** | ** | ** |
|
PT20H (20 hours) | Period 和 Duration | ||||
Period |
|
|
|
*** | *** | P10D (10 days) | Period 和 Duration |
* | 秒数被捕获到纳秒级精度。 |
** | 此类不存储此信息,但具有提供这些单位的时间的方法。 |
*** | 将 Period 添加到 ZonedDateTime 时,会观察到夏令时或其他本地时差。 |