Java 8 时间查询

x33g5p2x  于2022-09-17 转载在 Java  
字(1.9k)|赞(0)|评价(0)|浏览(446)

如果您在任何企业工作,特别是金融机构,那么在您需要询问诸如当前季度是什么时候、今天市场开放还是我们是否处于夏令时之类的问题时,这是很常见的。幸运的是,在 Java 8 中,日期时间 API 进行了彻底改革,以提供清晰的方法结构、更清晰的可读代码、不可变和可扩展。作为这次大修的一部分,引入了 TemporalQuery interface,它可用于从基于时间的对象中检索信息。换句话说,它允许您询问有关日期的问题。让我们看几个例子。

自定义 TemporalQuery 查询

假设我们是佛罗里达州的一家财产和意外险公司,为您提供相当数量的房主保险。在我们的评级逻辑​​中,在我们发送报价之前,有一系列规则只允许在飓风季节内处理一定数量的报价。我们需要做的是查询今天的日期并确定它是否在 6 月 1 日至 11 月 30 日之间的 hurricane season 内。我们可以创建一个静态实用程序类,可能是 DateUtil.isInHuricaneSeason,但是使用 java 8 我们可以创建一个飓风季节时间查询。

如果我们创建一个 HurricaneSeasonQuery 类,它可能类似于下面的代码。请注意,它实现了 TemporalQuery,因为我们只需要知道它是否在季节内,因此指定了 Boolean 的返回类型。 queryFrom 方法将传入的日期与 MonthDay object 进行比较,d1c2c1d 是表示月份和日期的组合的类。如果它在 6 月 1 日到 11 月 30 日之间,则返回 true。

public class HurricaneSeasonQuery implements TemporalQuery<Boolean> {

    /*
     * (non-Javadoc)
     *
     * @see java.time.temporal.TemporalQuery#queryFrom(java.time.temporal.
     * TemporalAccessor)
     */
    @Override
    public Boolean queryFrom(TemporalAccessor temporal) {

        LocalDate date = LocalDate.from(temporal);

        MonthDay juneFirst = MonthDay.of(Month.JUNE.getValue(), 1);
        MonthDay novemberThirty = MonthDay.of(Month.NOVEMBER.getValue(), 30);

        if (date.isAfter(juneFirst.atYear(date.getYear()))
                && date.isBefore(novemberThirty.atYear(date.getYear()))) {
            return true;
        } else {
            return false;
        }
    }
}

使用单元测试来演示调用者,我们将创建一个 LocalDate 并调用传入 TemporalQuery 的查询方法,该方法返回一个布尔对象。

@Test
public void is_during_hurricane_season () {

    LocalDate date = LocalDate.of(2014, Month.JUNE, 30);

    Boolean isHurricaneSeason = date.query(new HurricaneSeasonQuery());

    assertTrue(isHurricaneSeason);
}

预定义查询

TemporalQueries class 提供了几个可用于静态导入的预定义查询。假设我们要查找给定日期的时区。在下面的代码中,我们将使用返回 ZoneId 的预定义 TemporalQueries.zone 方法查询日期。

@Test
public void temporal_zone_id() {

    TemporalQuery<ZoneId> query = TemporalQueries.zone();

    LocalDateTime date = LocalDateTime.of(2014, Month.DECEMBER, 02, 0, 0);
    ZonedDateTime zonedDate = ZonedDateTime.of(date,
            ZoneId.of("Pacific/Chatham"));

    ZoneId zoneId = zonedDate.query(query);

    System.out.println(zoneId); // "Pacific/Chatham"
}

希望使用 TemporalQueries 将允许您重构或消除静态类以生成更简洁的代码来询问有关日期的问题。

相关文章

最新文章

更多