# 时间查询 / queries
TemporalQuery 可用于检索来自基于时间的对象的信息。
# 预定义的查询
TemporalQueries 类(注意复数)提供多个预定义的查询,包括当应用程序不能识别基于时间的对象的类型是有用的方法。 与调节器一样,预定义的查询被定义为静态方法,并被设计为与 静态导入语句一起使用。
// 精度查询,不过返回的是英文
TemporalQuery<TemporalUnit> query = TemporalQueries.precision();
System.out.printf("LocalDate precision is %s%n",
LocalDate.now().query(query));
System.out.printf("LocalDateTime precision is %s%n",
LocalDateTime.now().query(query));
System.out.printf("Year precision is %s%n",
Year.now().query(query));
System.out.printf("YearMonth precision is %s%n",
YearMonth.now().query(query));
System.out.printf("Instant precision is %s%n",
Instant.now().query(query));
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
输出
LocalDate precision is Days
LocalDateTime precision is Nanos
Year precision is Years
YearMonth precision is Months
Instant precision is Nanos
1
2
3
4
5
2
3
4
5
# 自定义查询
下列程序:查询一个日子是否是家人重要的日子
@Test
public void fun29() {
LocalDate date = LocalDate.now();
// 不使用拉姆达表达式查询
Boolean isFamilyVacation = date.query(new FamilyVacations());
// 使用拉姆达表达式查询
Boolean isFamilyBirthday = date.query(FamilyBirthdays::isFamilyBirthday);
if (isFamilyVacation.booleanValue() || isFamilyBirthday.booleanValue())
System.out.printf("%s 是一个重要的日子!%n", date);
else
System.out.printf("%s 不是一个重要的日子.%n", date);
}
// 该日子 去游乐园玩耍的日子
public class FamilyVacations implements TemporalQuery<Boolean> {
@Override
public Boolean queryFrom(TemporalAccessor date) {
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);
// Disneyland over Spring Break
// 4月 3号 ~ 4月8号 (包括)
if ((month == Month.APRIL.getValue()) && ((day >= 3) && (day <= 8)))
return Boolean.TRUE;
// Smith family reunion on Lake Saugatuck
// 8月 8号~14号 (包括)
if ((month == Month.AUGUST.getValue()) && ((day >= 8) && (day <= 14)))
return Boolean.TRUE;
return Boolean.FALSE;
}
}
// 该日子 检查是否是家人的生日
public static class FamilyBirthdays {
// 只检查月和日
public static Boolean isFamilyBirthday(TemporalAccessor date) {
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);
// Angie's 的生日是4月3号
if ((month == Month.APRIL.getValue()) && (day == 3))
return Boolean.TRUE;
// Sue's 的生日是6月18号
if ((month == Month.JUNE.getValue()) && (day == 18))
return Boolean.TRUE;
// Joe's 的生日是5月29号
if ((month == Month.MAY.getValue()) && (day == 29))
return Boolean.TRUE;
return Boolean.FALSE;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58