周末过滤器用于Java 8 LocalDateTime

Jue*_*gen 10 java filter java-8 java-time

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

具体来说,LocalDateTime如果给定日期在格林威治标准时间周五22:00到格林威治标准时间周日23:00之间,我希望有一个过滤器.

骨架看起来像这样:

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

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

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

Mis*_*sha 7

您如何期待这样的图书馆工作?当你的周末开始和结束时,你仍然需要告诉它,它最终会比简单的更短

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


Han*_*k D 5

一个简单的方法TemporalQuery就可以解决问题:

static class IsWeekendQuery implements TemporalQuery<Boolean>{

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

这样称呼它(.now()用来获取值进行测试):

boolean isItWeekendNow = LocalDateTime.now().query(new IsWeekendQuery());
Run Code Online (Sandbox Code Playgroud)

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

boolean isItWeekendNow = OffsetDateTime.now(ZoneOffset.UTC).query(new IsWeekendQuery());
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)


Shi*_*ari 2

我写了一个小程序来实现这个

程序

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;
    }

 }
Run Code Online (Sandbox Code Playgroud)