代码之家  ›  专栏  ›  技术社区  ›  bbKing

检查LocalDateTime是否在给定范围内(某些业务的工作时间)的干净方法

  •  0
  • bbKing  · 技术社区  · 2 年前

    周一至周五,8:00-12:30和14:00-18:00

    我有下面的方法来做到这一点,但我发现它对于这样一个简单的要求来说太麻烦了。有没有更优雅的方式让它更干净、更可读?可能正在使用Java 8 lambda魔术:-)?

    static boolean duringWorkingHours(LocalDateTime dateTime){
        //MO - FR 08:00 - 12:30
        //MO - FR 14:00 - 18:00
        //SA      08:00 - 14:00
    
        LocalDateTime morningStart   = dateTime.with(LocalTime.of(8,0));
        LocalDateTime morningEnd     = dateTime.with(LocalTime.of(12,30));
        LocalDateTime afternoonStart = dateTime.with(LocalTime.of(14,0));
        LocalDateTime afternoonEnd   = dateTime.with(LocalTime.of(18,0));
    
        LocalDateTime saturdayStart  = dateTime.with(LocalTime.of(8,0));
        LocalDateTime saturdayEnd    = dateTime.with(LocalTime.of(14,0));
    
        Set<DayOfWeek> weekDays      = Set.of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY,DayOfWeek.FRIDAY);
    
        boolean isWeekDay       = weekDays.contains(dateTime.getDayOfWeek());
        boolean isSaturday      = dateTime.getDayOfWeek() == DayOfWeek.SATURDAY;
    
        boolean isMorning       = (dateTime.isEqual(morningStart) || dateTime.isEqual(morningEnd))
                || (dateTime.isAfter(morningStart) && dateTime.isBefore(morningEnd));
    
        boolean isAfternoon     = (dateTime.isEqual(afternoonStart) || dateTime.isEqual(afternoonEnd))
                || (dateTime.isAfter(afternoonStart) && dateTime.isBefore(afternoonEnd));
    
        boolean isSaturdayRange = (dateTime.isEqual(saturdayStart) || dateTime.isEqual(saturdayEnd))
                || (dateTime.isAfter(saturdayStart) && dateTime.isBefore(saturdayEnd));
    
        return (isWeekDay && isMorning) || (isWeekDay && isAfternoon) || (isSaturday && isSaturdayRange);
    }
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   shmosel    2 年前

    来个小帮手,让比较更容易,怎么样

    private static <C extends Comparable<? super C>> boolean isBetween(C value, C start, C end) {
        return value.compareTo(start) >= 0 && value.compareTo(end) < 0;
    }
    
    static boolean duringWorkingHours(LocalDateTime dateTime) {
        LocalTime time = dateTime.toLocalTime();
    
        switch (dateTime.getDayOfWeek()) {
            case SUNDAY:
                return false;
            case SATURDAY:
                return isBetween(time, LocalTime.parse("08:00"), LocalTime.parse("14:00"));
            default:
                return isBetween(time, LocalTime.parse("08:00"), LocalTime.parse("12:30"))
                    || isBetween(time, LocalTime.parse("14:00"), LocalTime.parse("18:00"));
        }
    }