# Java 8 – `TemporalQuery`

> 原文： [https://howtodoinjava.com/java/date-time/temporalquery/](https://howtodoinjava.com/java/date-time/temporalquery/)

`TemporalQuery`是查询临时对象以制定更好的业务决策的标准方法。 在 [Java 8](https://howtodoinjava.com/java-8-tutorial/) 中，所有主要的日期时间类都实现了`Temporal`和`TemporalAccessor`接口，因此`TemporalQuery`可以针对所有这些 Java 类运行。

## 1\. `TemporalQuery`接口

[`TemporalQuery`](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/TemporalQuery.html)是一个函数式接口，因此可以用作 [lambda 表达式](https://howtodoinjava.com/java8/lambda-expressions/)或[方法参考](https://howtodoinjava.com/java8/lambda-method-references-example/)的分配目标。 方法`queryForm()`使用时间对象查询并返回查询的值。

该实现定义查询的逻辑，并负责记录该逻辑。 它可以使用`TemporalAccessor`上的任何方法来确定结果。

输入对象不得更改。

```java
@FunctionalInterface
public interface TemporalQuery<R> 
{
	R queryFrom(TemporalAccessor temporal);
}

```

## 2\. `TemporalQuery`示例

让我们看一些示例，以更好地了解此接口。

#### 2.1 给定的时间在营业时间内？

我们可以使用`TemporalQuery`确定任何给定时间是否在一定范围内。 例如。 时间是否介于工作时间之间。

```java
LocalTime now = LocalTime.now();

System.out.println("Currently Working :: " + now.query(WorkingHoursQuery));

private static final TemporalQuery<Boolean> WorkingHoursQuery = temporal -> {
	LocalTime t = LocalTime.from(temporal);
	return t.compareTo(LocalTime.of(9, 0)) >= 0 
			&& t.compareTo(LocalTime.of(17, 0)) < 0;
};

```

程序输出：

```java
Currently Working :: false

```

#### 2.2 获取当前财务季度

我们还可以使用`TemporalQuery`确定该年度的当前财务季度。 在下面的示例中，第一个财政季度被认为是从一月到三月。 更改方法实现以实现所需的行为。

```java
LocalDate today = LocalDate.now();

System.out.println("Current Financial Quarter :: " + today.query(CurrentQuarterQuery));

private static final TemporalQuery<Integer> CurrentQuarterQuery = temporal -> {
	LocalDate date = LocalDate.from(temporal);
	return (date.getMonthValue() / 3) + 1;
};

```

程序输出：

```java
Current Financial Quarter :: 2

```

请向我发送在 Java 8 中使用带有日期的`TemporalQuery`的有关问题。

学习愉快！

[下载源码](https://github.com/lokeshgupta1981/Core-Java/tree/master/src/com/howtodoinjava/core/datetime)