文档

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

Temporal 包

java.time.temporal 包提供了一组接口,类和枚举,支持日期和时间代码,特别是日期和时间计算。

这些接口旨在用于最低级别。典型的应用程序代码应根据具体类型声明变量和参数,例如 LocalDateZonedDateTime,而不是根据 Temporal 接口。这与声明 String 类型的变量完全相同,而不是类型 CharSequence 的变量。

Temporal 和 TemporalAccessor

Temporal 接口提供了一个用于访问基于时间的对象的框架,并由基于时间的类实现,例如 InstantLocalDateTimeZonedDateTime。此接口提供了添加或减去时间单位的方法,使基于时间的算术在各种日期和时间类中变得容易和一致。TemporalAccessor 接口提供 Temporal 接口的只读版本。

TemporalTemporalAccessor 对象都是根据 TemporalField 接口中指定的字段定义的。ChronoField 枚举是 TemporalField 接口的具体实现,并提供了一组丰富的已定义常量,例如 DAY_OF_WEEKMINUTE_OF_HOURMONTH_OF_YEAR

这些字段的单位由 TemporalUnit 接口指定。ChronoUnit 枚举实现 TemporalUnit 接口。字段 ChronoField.DAY_OF_WEEKChronoUnit.DAYSChronoUnit.WEEKS 的组合。ChronoFieldChronoUnit 枚举将在以下各节中讨论。

Temporal 接口中基于算法的方法需要根据 TemporalAmount 值定义的参数。PeriodDuration 类(在 Period and Duration 中讨论)实现 TemporalAmount 接口。

ChronoField 和 IsoFields

实现 TemporalField 接口的 ChronoField 枚举提供了一组丰富的常量,用于访问日期和时间值。一些例子是 CLOCK_HOUR_OF_DAYNANO_OF_DAYDAY_OF_YEAR。此枚举可用于表示时间的概念方面,例如一年中的第三周,一天中的第 11 个小时或该月的第一个星期一。当遇到未知类型的 Temporal 时,可以使用 TemporalAccessor.isSupported(TemporalField) 方法来确定 Temporal 是否支持特定字段。以下代码行返回 false,表示 LocalDate 不支持 ChronoField.CLOCK_HOUR_OF_DAY

boolean isSupported = LocalDate.now().isSupported(ChronoField.CLOCK_HOUR_OF_DAY);

ISO-8601 日历系统特有的附加字段在 IsoFields 类中定义。以下示例显示如何使用 ChronoFieldIsoFields 获取字段的值:

time.get(ChronoField.MILLI_OF_SECOND)
int qoy = date.get(IsoFields.QUARTER_OF_YEAR);

另外两个类定义了可能有用的其他字段,WeekFieldsJulianFields

ChronoUnit

ChronoUnit 枚举实现了 TemporalUnit 接口,并提供了一组基于日期和时间的标准单位,从毫秒到千年。请注意,并非所有类都支持所有 ChronoUnit 对象。例如,Instant 类不支持 ChronoUnit.MONTHSChronoUnit.YEARSTemporalAccessor.isSupported(TemporalUnit) 方法可用于验证类是否支持特定时间单位。以下对 isSupported 的调用返回 false,确认 Instant 类不支持 ChronoUnit.DAYS

boolean isSupported = instant.isSupported(ChronoUnit.DAYS);

Previous page: Parsing and Formatting
Next page: Temporal Adjuster