由于您想将 LocalDateTime 与 DayOfWeek+LocalTime 进行比较,或者检查它是否在两个 DayOfWeek+LocalTime 对之间,所以辅助类可能会更好:
public final class DayOfWeekTimeRange {
private final DayOfWeek fromDay;
private final LocalTime fromTime;
private final DayOfWeek toDay;
private final LocalTime toTime;
private final boolean inverted;
public DayOfWeekTimeRange(DayOfWeek fromDay, LocalTime fromTime, DayOfWeek toDay, LocalTime toTime) {
this.fromDay = fromDay;
this.fromTime = fromTime;
this.toDay = toDay;
this.toTime = toTime;
this.inverted = compare(this.fromDay, this.fromTime, this.toDay, this.toTime) > 0;
}
public boolean inRange(LocalDateTime dateTime) {
return inRange(dateTime.getDayOfWeek(), dateTime.toLocalTime());
}
public boolean inRange(DayOfWeek day, LocalTime time) {
boolean fromOk = compare(day, time, this.fromDay, this.fromTime) >= 0; // Lower-inclusive
boolean toOk = compare(day, time, this.toDay , this.toTime ) < 0; // Upper-exclusive
return (this.inverted ? fromOk || toOk : fromOk && toOk);
}
private static int compare(DayOfWeek day1, LocalTime time1, DayOfWeek day2, LocalTime time2) {
int cmp = day1.compareTo(day2);
if (cmp == 0)
cmp = time1.compareTo(time2);
return cmp;
}
}
测试
// Fri 10:00 PM to Sun 10:00 PM
DayOfWeekTimeRange range = new DayOfWeekTimeRange(DayOfWeek.FRIDAY, LocalTime.of(20,0), DayOfWeek.SUNDAY, LocalTime.of(20,0));
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 12, 22, 0))); // Thu Nov. 12 2015 at 10:00 PM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 14, 8, 0))); // Sat Nov. 14 2015 at 8:00 AM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 16, 15, 0))); // Mon Nov. 16 2015 at 3:00 PM
// Fri 10:00 PM to Mon 10:00 PM
range = new DayOfWeekTimeRange(DayOfWeek.FRIDAY, LocalTime.of(20,0), DayOfWeek.MONDAY, LocalTime.of(20,0));
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 12, 22, 0))); // Thu Nov. 12 2015 at 10:00 PM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 14, 8, 0))); // Sat Nov. 14 2015 at 8:00 AM
System.out.println(range.inRange(LocalDateTime.of(2015, 11, 16, 15, 0))); // Mon Nov. 16 2015 at 3:00 PM
输出
false
true
false
false
true
true
替代方案
当然,如果你用DayOfWeek+LocalTime做很多处理,你应该考虑实现你自己的LocalDayOfWeekTime类,将两者结合起来,同样LocalDateTime只是一个结合的@987654333 @+LocalTime(确实如此,请自行检查)。