时间包
java.time.temporal软件包提供了支持日期和时间代码,尤其是日期和时间计算的interface,类和枚举的集合。
这些interface旨在用于最低级别。典型的应用程序代码应根据具体类型(例如LocalDate
或ZonedDateTime
)而不是Temporal
interface来声明变量和参数。这与声明String
类型而不是CharSequence
类型的变量完全相同。
Temporal and TemporalAccessor
Temporalinterface提供用于访问基于时间的对象的框架,并由基于时间的类(例如Instant
,LocalDateTime
和ZonedDateTime
)实现。该interface提供了添加或减少时间单位的方法,从而使基于时间的算术变得容易且在各种日期和时间类中保持一致。 TemporalAccessorinterface提供了Temporal
interface的只读版本。
Temporal
和TemporalAccessor
对象都是根据TemporalFieldinterface中指定的字段定义的。 ChronoField枚举是TemporalField
interface的具体实现,并提供了一组丰富的已定义常量,例如DAY_OF_WEEK
,MINUTE_OF_HOUR
和MONTH_OF_YEAR
。
这些字段的单位由TemporalUnitinterface指定。 ChronoUnit
枚举实现TemporalUnit
interface。字段ChronoField\.DAY_OF_WEEK
是ChronoUnit\.DAYS
和ChronoUnit\.WEEKS
的组合。以下各节将讨论ChronoField
和ChronoUnit
枚举。
Temporal
interface中基于算术的方法需要根据TemporalAmount值定义的参数。 Period
和Duration
类(在期限和期限中讨论)实现TemporalAmount
interface。
ChronoField 和 IsoFields
实现TemporalField
interface的ChronoField枚举提供了一组丰富的常量来访问日期和时间值。几个示例是CLOCK_HOUR_OF_DAY
,NANO_OF_DAY
和DAY_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 系统的其他字段。以下示例说明如何使用ChronoField
和IsoFields
来获取字段的值:
time.get(ChronoField.MILLI_OF_SECOND)
int qoy = date.get(IsoFields.QUARTER_OF_YEAR);
另外两个类别定义了可能有用的其他字段WeekFields和JulianFields。
ChronoUnit
ChronoUnit枚举实现TemporalUnit
interface,并基于日期和时间(从毫秒到几千年)提供一组标准单位。请注意,并非所有ChronoUnit
对象都受所有类支持。例如,Instant
类不支持ChronoUnit\.MONTHS
或ChronoUnit\.YEARS
。 TemporalAccessor.isSupported(TemporalUnit)方法可用于验证类是否支持特定的时间单位。以下对isSupported
的调用返回false
,确认Instant
类不支持ChronoUnit\.DAYS
。
boolean isSupported = instant.isSupported(ChronoUnit.DAYS);