TemporalQuery
的常见实现。
这个类提供了TemporalQuery
的常见实现。这些在这里定义是因为它们必须是常量,而使用lambda表达式并不能保证这一点。通过在这里分配它们一次,它们就变成了'普通'的Java常量。
查询是从时间对象中提取信息的关键工具。它们存在是为了外部化查询过程,允许不同的方法,就像策略设计模式一样。例如,一个查询可能检查日期是否是闰年中2月29日的前一天,或者计算距离你下一个生日还有多少天。
TemporalField
接口提供了另一种查询时间对象的机制。该接口仅限于返回一个long
。相比之下,查询可以返回任何类型。
有两种等效的使用TemporalQuery
的方式。第一种是直接在这个接口上调用方法。第二种是使用TemporalAccessor.query(TemporalQuery)
:
// 这两行是等效的,但第二种方法是推荐的 temporal = thisQuery.queryFrom(temporal); temporal = temporal.query(thisQuery);推荐使用第二种方法
query(TemporalQuery)
,因为在代码中更清晰易读。
最常见的实现是方法引用,比如LocalDate::from
和ZoneId::from
。还提供了额外的常见查询来返回:
- 一个年表(Chronology),
- 一个本地日期(LocalDate),
- 一个本地时间(LocalTime),
- 一个区域偏移(ZoneOffset),
- 一个精度(precision),
- 一个区域,或
- 一个区域ID。
- 自版本:
- 1.8
-
Method Summary
Modifier and TypeMethodDescriptionstatic TemporalQuery
<Chronology> 一个用于Chronology
的查询。static TemporalQuery
<LocalDate> 一个用于LocalDate
的查询,如果找不到则返回null。static TemporalQuery
<LocalTime> 一个用于LocalTime
的查询,如果找不到则返回null。static TemporalQuery
<ZoneOffset> offset()
一个用于ZoneOffset
的查询,如果找不到则返回null。static TemporalQuery
<TemporalUnit> 一个用于最小支持单位的查询。static TemporalQuery
<ZoneId> zone()
一个宽松的用于ZoneId
的查询,回退到ZoneOffset
。static TemporalQuery
<ZoneId> zoneId()
一个严格的用于ZoneId
的查询。
-
Method Details
-
zoneId
一个严格的用于ZoneId
的查询。这个查询从
TemporalAccessor
中查询区域。只有当日期时间概念上包含ZoneId
时,才会返回区域。如果日期时间仅在概念上具有ZoneOffset
,则不会返回区域。因此,ZonedDateTime
将返回getZone()
的结果,但OffsetDateTime
将返回null。在大多数情况下,应用程序应该使用
zone()
,因为这个查询太严格了。JDK类实现
TemporalAccessor
的结果如下:LocalDate
返回nullLocalTime
返回nullLocalDateTime
返回nullZonedDateTime
返回关联的区域OffsetTime
返回nullOffsetDateTime
返回nullChronoLocalDate
返回nullChronoLocalDateTime
返回nullChronoZonedDateTime
返回关联的区域Era
返回nullDayOfWeek
返回nullMonth
返回nullYear
返回nullYearMonth
返回nullMonthDay
返回nullZoneOffset
返回nullInstant
返回null- 返回:
- 一个可以获取时间区域ID的查询,非null
-
chronology
一个用于Chronology
的查询。这个查询从
TemporalAccessor
中查询年表。如果目标TemporalAccessor
表示日期或日期的一部分,则应返回日期所表示的年表。由于这个定义,仅表示时间的对象,比如LocalTime
,将返回null。JDK类实现
TemporalAccessor
的结果如下:LocalDate
返回IsoChronology.INSTANCE
LocalTime
返回null(不表示日期)LocalDateTime
返回IsoChronology.INSTANCE
ZonedDateTime
返回IsoChronology.INSTANCE
OffsetTime
返回null(不表示日期)OffsetDateTime
返回IsoChronology.INSTANCE
ChronoLocalDate
返回关联的年表ChronoLocalDateTime
返回关联的年表ChronoZonedDateTime
返回关联的年表Era
返回关联的年表DayOfWeek
返回null(跨年表共享)Month
返回IsoChronology.INSTANCE
Year
返回IsoChronology.INSTANCE
YearMonth
返回IsoChronology.INSTANCE
MonthDay
返回nullIsoChronology.INSTANCE
ZoneOffset
返回null(不表示日期)Instant
返回null(不表示日期)方法
Chronology.from(TemporalAccessor)
可以通过方法引用Chronology::from
用作TemporalQuery
。该方法与此查询等效,只是如果无法获取年表,则会抛出异常。- 返回:
- 一个可以获取时间年表的查询,非null
-
precision
一个用于最小支持单位的查询。这个查询从
TemporalAccessor
中查询时间精度。如果目标TemporalAccessor
表示一致或完整的日期时间、日期或时间,则必须返回实际支持的最小精度。请注意,诸如NANO_OF_DAY
和NANO_OF_SECOND
之类的字段被定义为始终返回,忽略精度,因此这是找到实际支持的最小单位的唯一方法。例如,如果GregorianCalendar
实现了TemporalAccessor
,它将返回MILLIS
的精度。JDK类实现
TemporalAccessor
的结果如下:LocalDate
返回DAYS
LocalTime
返回NANOS
LocalDateTime
返回NANOS
ZonedDateTime
返回NANOS
OffsetTime
返回NANOS
OffsetDateTime
返回NANOS
ChronoLocalDate
返回DAYS
ChronoLocalDateTime
返回NANOS
ChronoZonedDateTime
返回NANOS
Era
返回ERAS
DayOfWeek
返回DAYS
Month
返回MONTHS
Year
返回YEARS
YearMonth
返回MONTHS
MonthDay
返回null(不表示完整的日期或时间)ZoneOffset
返回null(不表示日期或时间)Instant
返回NANOS
- 返回:
- 一个可以获取时间精度的查询,非null
-
zone
一个宽松的用于ZoneId
的查询,回退到ZoneOffset
。这个查询从
TemporalAccessor
中查询区域。它首先尝试获取区域,使用zoneId()
。如果找不到,它会尝试获取offset()
。因此,ZonedDateTime
将返回getZone()
的结果,而OffsetDateTime
将返回getOffset()
的结果。在大多数情况下,应用程序应该使用这个查询,而不是
#zoneId()
。方法
ZoneId.from(TemporalAccessor)
可以通过方法引用ZoneId::from
用作TemporalQuery
。该方法与此查询等效,只是如果无法获取区域,则会抛出异常。- 返回:
- 一个可以获取时间区域ID或偏移的查询,非null
-
offset
一个用于ZoneOffset
的查询,如果找不到则返回null。这返回一个
TemporalQuery
,可用于查询时间对象的偏移量。如果时间对象无法提供偏移量,则查询将返回null。查询实现检查
OFFSET_SECONDS
字段,并使用它创建一个ZoneOffset
。方法
ZoneOffset.from(TemporalAccessor)
可以通过方法引用ZoneOffset::from
用作TemporalQuery
。如果时间对象包含偏移量,则此查询和ZoneOffset::from
将返回相同的结果。如果时间对象不包含偏移量,则方法引用将抛出异常,而此查询将返回null。- 返回:
- 一个可以获取时间偏移的查询,非null
-
localDate
一个用于LocalDate
的查询,如果找不到则返回null。这返回一个
TemporalQuery
,可用于查询时间对象的本地日期。如果时间对象无法提供本地日期,则查询将返回null。查询实现检查
EPOCH_DAY
字段,并使用它创建一个LocalDate
。方法
LocalDate.from(TemporalAccessor)
可以通过方法引用LocalDate::from
用作TemporalQuery
。如果时间对象包含日期,则此查询和LocalDate::from
将返回相同的结果。如果时间对象不包含日期,则方法引用将抛出异常,而此查询将返回null。- 返回:
- 一个可以获取时间日期的查询,非null
-
localTime
查询LocalTime
,如果未找到则返回null。这将返回一个
TemporalQuery
,可用于查询时间对象的本地时间。如果时间对象无法提供本地时间,则查询将返回null。查询实现会检查
NANO_OF_DAY
字段,并使用它创建一个LocalTime
。方法
LocalTime.from(TemporalAccessor)
可以通过方法引用LocalTime::from
用作TemporalQuery
。如果时间对象包含时间,则此查询和LocalTime::from
将返回相同的结果。如果时间对象不包含时间,则方法引用将引发异常,而此查询将返回null。- 返回:
- 可获取时间对象时间的查询,非null
-