首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8 LocalDateTime周末过滤器

Java8 LocalDateTime周末过滤器
EN

Stack Overflow用户
提问于 2016-04-26 06:44:40
回答 7查看 12.5K关注 0票数 15

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

具体来说,如果给定的日期在格林尼治时间星期五22:00和格林尼治时间周日23:00之间,我想要一个LocalDateTime过滤器。

一具骨架看起来可能是这样的:

代码语言:javascript
复制
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时代库(或任何其他现有的过滤器方法)。

我知道如何检查一周中的一天,小时等,但避免重新发明车轮。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-04-26 07:30:50

为了实现这一点,我编写了一个小程序。

程序

代码语言:javascript
复制
public class TestWeekend {
    private static final int FRIDAY = 5;
    private static final int SATURDAY = 6;
    private static final int SUNDAY = 7;
    private static final Integer WEEKEND_START_FRIDAY_CUT_OFF_HOUR = 22;
    private static final Integer WEEKEND_END_SUNDAY_CUT_OFF_HOUR = 23;
    private static List<Integer> weekendDaysList = Arrays.asList(FRIDAY, SATURDAY, SUNDAY);

    public static void main(String []args) throws FileNotFoundException {
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,22,18,39)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,22,21,59)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,22,22,0)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,23,5,0)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,24,8,0)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,24,22,59)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,24,23,0)));
        System.out.println(" is weekend - "+isWeekend(LocalDateTime.of(2016,4,25,11,5)));
    }

    public static  boolean isWeekend(LocalDateTime dateTime) {
        System.out.print("Date - "+dateTime+" , ");
        if(weekendDaysList.contains(dateTime.getDayOfWeek().getValue()) ){
            if(SATURDAY ==  dateTime.getDayOfWeek().getValue()){
                return true;
            }
            if(FRIDAY == dateTime.getDayOfWeek().getValue() && dateTime.getHour() >=WEEKEND_START_FRIDAY_CUT_OFF_HOUR){
               return true;
            }else if(SUNDAY == dateTime.getDayOfWeek().getValue() && dateTime.getHour()  < WEEKEND_END_SUNDAY_CUT_OFF_HOUR ){
                return   true;
            }
        }
        //Checks if dateTime falls in between Friday's 22:00 GMT and Sunday's 23:00 GMT
         return false;
    }

 }
票数 1
EN

Stack Overflow用户

发布于 2016-04-26 08:15:15

你认为这样的图书馆会怎样运作呢?当你的周末开始和结束的时候,你仍然需要告诉它,它最终不会比简单的短得多。

代码语言:javascript
复制
boolean isWeekend(LocalDateTime dt) {
    switch(dt.getDayOfWeek()) {
        case FRIDAY:
            return dt.getHour() >= ...;
        case SATURDAY:
            return true;
        case SUNDAY:
            return dt.getHour() < ...;
        default:
            return false;
    }
}
票数 8
EN

Stack Overflow用户

发布于 2016-04-27 01:51:39

一个简单的TemporalQuery就可以做到这一点:

代码语言:javascript
复制
static class IsWeekendQuery implements TemporalQuery<Boolean>{

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

它将被调用如下(使用.now()获取要测试的值):

代码语言:javascript
复制
boolean isItWeekendNow = LocalDateTime.now().query(new IsWeekendQuery());

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

代码语言:javascript
复制
boolean isItWeekendNow = OffsetDateTime.now(ZoneOffset.UTC).query(new IsWeekendQuery());

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

代码语言:javascript
复制
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);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36857191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档