所有datetime類都支持查詢,查詢是對信息的請求。
我們可以從datetime對象獲取日期時間組件,例如,我們可以從LocalDate獲取年份。
查詢請求不可用作組件的信息。 例如,我們可以查詢LocalDate以查看它是否為星期一。 查詢的結(jié)果可以是任何類型。
TemporalQuery<R>
接口表示一個查詢。
所有datetime類都有一個query()方法,TemporalQuery作為參數(shù)。
TemporalQueries
類包含幾個預(yù)定義的查詢。
如果datetime對象沒有查詢請求的信息,該查詢返回null。
以下代碼顯示如何使用預(yù)定義的查詢。
import java.time.LocalDate; import java.time.LocalTime; import java.time.ZonedDateTime; import java.time.temporal.TemporalQueries; import java.time.temporal.TemporalQuery; import java.time.temporal.TemporalUnit; public class Main { public static void main(String[] args) { TemporalQuery<TemporalUnit> precisionQuery = TemporalQueries.precision(); TemporalQuery<LocalDate> localDateQuery = TemporalQueries.localDate(); // Query a LocalDate LocalDate ld = LocalDate.now(); TemporalUnit precision = ld.query(precisionQuery); LocalDate queryDate = ld.query(localDateQuery); System.out.println("Precision of LocalDate: " + precision); System.out.println("LocalDate of LocalDate: " + queryDate); // Query a LocalTime LocalTime lt = LocalTime.now(); precision = lt.query(precisionQuery); queryDate = lt.query(localDateQuery); System.out.println("Precision of LocalTime: " + precision); System.out.println("LocalDate of LocalTime: " + queryDate); // Query a ZonedDateTime ZonedDateTime zdt = ZonedDateTime.now(); precision = zdt.query(precisionQuery); queryDate = zdt.query(localDateQuery); System.out.println("Precision of ZonedDateTime: " + precision); System.out.println("LocalDate of ZonedDateTime: " + queryDate); } }
上面的代碼生成以下結(jié)果。
我們可以通過兩種方式創(chuàng)建自定義查詢。
import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQuery; public class Main { public static void main(String[] args) { LocalDate ld1 = LocalDate.of(2013, 12,1); Boolean is = ld1.query(new Monday1Query()); System.out.println(is); } } class Monday1Query implements TemporalQuery<Boolean> { @Override public Boolean queryFrom(TemporalAccessor temporal) { if (temporal.isSupported(ChronoField.DAY_OF_MONTH) && temporal.isSupported(ChronoField.DAY_OF_WEEK)) { int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH); int weekDay = temporal.get(ChronoField.DAY_OF_WEEK); DayOfWeek dayOfWeek = DayOfWeek.of(weekDay); if (dayOfMonth == 1 && dayOfWeek == DayOfWeek.MONDAY) { return Boolean.TRUE; } } return Boolean.FALSE; } }
上面的代碼生成以下結(jié)果。
以下代碼使用方法引用重寫上面的代碼。
import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAccessor; public class Main { public static void main(String[] args) { LocalDate ld1 = LocalDate.of(2013, 12, 1); Boolean is = ld1.query(Main::queryFrom); System.out.println(is); } public static Boolean queryFrom(TemporalAccessor temporal) { if (temporal.isSupported(ChronoField.DAY_OF_MONTH) && temporal.isSupported(ChronoField.DAY_OF_WEEK)) { int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH); int weekDay = temporal.get(ChronoField.DAY_OF_WEEK); DayOfWeek dayOfWeek = DayOfWeek.of(weekDay); if (dayOfMonth == 1 && dayOfWeek == DayOfWeek.MONDAY) { return Boolean.TRUE; } } return Boolean.FALSE; } }
上面的代碼生成以下結(jié)果。
更多建議: