Since you want to compare a LocalDateTime
to a DayOfWeek
+LocalTime
, or rather check if it's between two DayOfWeek
+LocalTime
pairs, a helper class may be good:
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;
}
}
Test
// 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
Output
false
true
false
false
true
true
Alternative
Of course, if you do a lot of processing with DayOfWeek
+LocalTime
, you should consider implementing your own LocalDayOfWeekTime
class, combining the two, in the same way LocalDateTime
is simply a combined LocalDate
+LocalTime
(and it is, check for yourself).