Java 8 LocalDateTime 的周末过滤器

2022-09-03 13:51:09

我想写一个布尔值函数,如果给定的落在两个特定的时间点之间,则返回true,否则为false。LocalDateTime

具体来说,如果给定日期在22:00 GMT星期五和23:00 GMT星期日之间,我希望有一个过滤器。LocalDateTime

骨架可能如下所示:

public boolean isWeekend(LocalDateTime dateTime) {
    //Checks if dateTime falls in between Friday's 22:00 GMT and Sunday's 23:00 GMT
    //return ...???
}

这基本上是一个周末过滤器,我想知道是否有新的Java 8 Time库(或任何其他现有的过滤器方法)的简单解决方案。

我知道如何检查星期几,小时等,但避免重新发明轮子。


答案 1

您期望这样的库如何工作?你仍然需要告诉你周末何时开始和结束,它最终不会比简单的短得多。

boolean isWeekend(LocalDateTime dt) {
    switch(dt.getDayOfWeek()) {
        case FRIDAY:
            return dt.getHour() >= ...;
        case SATURDAY:
            return true;
        case SUNDAY:
            return dt.getHour() < ...;
        default:
            return false;
    }
}

答案 2

一个简单的方法就可以了:TemporalQuery

static class IsWeekendQuery implements TemporalQuery<Boolean>{

    @Override
    public Boolean queryFrom(TemporalAccessor temporal) {
        return temporal.get(ChronoField.DAY_OF_WEEK) >= 5;
    }
}

它将被这样调用(用于获取要测试的值):.now()

boolean isItWeekendNow = LocalDateTime.now().query(new IsWeekendQuery());

或者,特别是在 UTC 时间(用于获取要测试的值):.now()

boolean isItWeekendNow = OffsetDateTime.now(ZoneOffset.UTC).query(new IsWeekendQuery());

除了您的问题之外,没有理由在每次使用时都创建一个新实例,因此您可能希望创建一个静态最终实例,将逻辑封装在 lambda 表达式中:IsWeekendQueryTemporalQuery

static final TemporalQuery<Boolean> IS_WEEKEND_QUERY = 
    t -> t.get(ChronoField.DAY_OF_WEEK) >= 5;

boolean isItWeekendNow = OffsetDateTime.now(ZoneOffset.UTC).query(IS_WEEKEND_QUERY);

推荐