时间包

java.time.temporal软件包提供了支持日期和时间代码,尤其是日期和时间计算的interface,类和枚举的集合。

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

Temporal and TemporalAccessor

Temporalinterface提供用于访问基于时间的对象的框架,并由基于时间的类(例如InstantLocalDateTimeZonedDateTime)实现。该interface提供了添加或减少时间单位的方法,从而使基于时间的算术变得容易且在各种日期和时间类中保持一致。 TemporalAccessorinterface提供了Temporalinterface的只读版本。

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

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

Temporalinterface中基于算术的方法需要根据TemporalAmount值定义的参数。 PeriodDuration类(在期限和期限中讨论)实现TemporalAmountinterface。

ChronoField 和 IsoFields

实现TemporalFieldinterface的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);

IsoFields类中定义了特定于 ISO-8601calendar 系统的其他字段。以下示例说明如何使用ChronoFieldIsoFields来获取字段的值:

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

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

ChronoUnit

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

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