JDK版本:11
TemporalQuery
@FunctionalInterface
public interface TemporalQuery<R> {R queryFrom(TemporalAccessor temporal);
}
emporalQuery是Java 8中用于時間查詢的一個函數式接口,它允許用戶對日期和時間進行查詢。TemporalQuery接口中定義了一些方法,比如queryFrom(TemporalAccessor temporal),該方法允許用戶從給定的時間對象中查詢特定的時間信息。
TemporalAccessor
TemporalAccessor是一個時間訪問器,它提供了一些方法來訪問時間信息,比如get(ChronoField field),getLong(ChronoField field),query(TemporalQuery query)等。這些方法可以讓用戶獲取到日期和時間的各個部分,比如年、月、日、時、分、秒等。LocalDate、LocalTime、LocalDateTime都是TemporalAccessor的實現在類。通過TemporalQuery和TemporalAccessor接口,用戶可以對日期和時間進行更為精細的控制和操作,以滿足各種不同的需求。
TemporalQueries
TemporalQueries是Java中用于時間查詢的類,它提供了TemporalQuery的常見實現。此類允許根據策略設計模式采用不同的方法,從臨時對象中提取信息的關鍵工具。
TemporalQueries類中定義了一些方法,比如:
- static TemporalQuery localDate():查詢LocalDate,如果找不到則返回null。
- static TemporalQuery localTime():查詢LocalTime,如果找不到則返回null。
- static TemporalQuery offset():查詢ZoneOffset,如果找不到則返回null。
這些方法可以用于查詢時間信息,比如日期、時間、時區偏移量等。通過TemporalQueries類,用戶可以更加方便地進行時間查詢操作。
TemporalQuery、TemporalQueries使用示例
這里ZonedDateTime為例,先獲取一下當前的日期時間的ZonedDateTime實例,如果我想獲取一下這個日期時間對象時區的ZoneId,需要怎么辦呢?可以這樣
@Test
public void test(){ZonedDateTime zonedDateTime=ZonedDateTime.now();TemporalQuery<ZoneId> temporalQuery = TemporalQueries.zoneId();ZoneId zoneId = zonedDateTime.query(temporalQuery);System.out.println(zoneId);//輸出結果:Asia/Shanghai
}
如果還想從ZonedDateTime實例中獲取一下LocalDate、LocalTime、ZoneOffset對象,怎么辦呢?可以這樣:
@Test
public void test(){ZonedDateTime zonedDateTime=ZonedDateTime.now();TemporalQuery<ZoneOffset> temporalQuery1 = TemporalQueries.offset();ZoneOffset zoneOffset = zonedDateTime.query(temporalQuery1);System.out.println(zoneOffset);//輸出結果:+08:00TemporalQuery<LocalDate> temporalQuery2 = TemporalQueries.localDate();LocalDate localDate = zonedDateTime.query(temporalQuery2);System.out.println(localDate);//輸出結果:2023-11-29TemporalQuery<LocalTime> temporalQuery3 = TemporalQueries.localTime();LocalTime localTime = zonedDateTime.query(temporalQuery3);System.out.println(localTime);//輸出結果:18:10:40.622423500
}
如果還想從ZonedDateTime實例中獲取的目標對象不存在,會異常嗎?當然不會,而是會返回null
@Test
public void test2(){TemporalQuery<ZoneOffset> offset = TemporalQueries.offset();LocalDateTime localDateTime=LocalDateTime.now();//本地日期時間是不帶時區偏移量的ZoneOffset query = localDateTime.query(offset);//肯定查詢不到結果System.out.println(query);//輸出結果:null
}
總結
TemporalQueries和TemporalQuery是Java時間庫中的兩個相關類,它們都用于處理時間查詢。
TemporalQueries是一個類,它提供了TemporalQuery的常見實現。這些實現是常量,因為lambda表達式不能保證這一點。通過在這里分配一次,它們變成了“普通的”Java常量。
TemporalQuery是一個接口,它定義了從臨時對象中提取信息的關鍵工具。這些工具的存在是為了使查詢過程外化,允許根據策略設計模式采用不同的方法。例如,可以查詢日期是否是閏年2月29日前一天的查詢,或計算下一個生日的天數。
因此,TemporalQueries和TemporalQuery之間的關系是它們一起提供了一種機制來執行時間查詢。TemporalQueries提供了常見的查詢實現,而TemporalQuery定義了查詢的通用接口。