首先,我会使用Joda Time及其LocalTime
类型来表示时间。然后你可以这样做:
static boolean isInRange(LocalTime start, LocalTime end, LocalTime value) {
// Avoid equality problems - see description
if (value.equals(start) || value.equals(end)) {
return true;
}
if (start.compareTo(end) > 0) {
return !isInRange(end, start, value);
}
return start.compareTo(value) < 0 && value.compareTo(end) < 0;
}
换句话说,您通常只会在value
获得开始/结束范围时进行最终比较start <= end
- 但是如果您从相反的方式开始,那么您只需反转进行反向比较的结果.
换句话说,如果某物不在范围内(上午 2 点,晚上 10 点),则它在范围内(晚上 10 点,凌晨2 点)。
或者,您可以避免递归调用:
static boolean isInRange(LocalTime start, LocalTime end, LocalTime value) {
return start.compareTo(end) > 0
// Reversed: if it's earlier than the end point, or later than the start
? value.compareTo(end) <= 0 || start.compareTo(value) <= 0
: start.compareTo(value) <= 0 && value.compareTo(end) <= 0;
}
棘手的一点是平等。上面的代码假定起点/终点都包含在内,无论哪种方式。如果您想要其他任何东西,则需要非常仔细地考虑每种情况。