首先,我用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点)的而不是,则范围内(10pm,2am)。
或者,你可以避开递归调用:
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;
}
棘手位是平等的。上面的代码假设开始/结束点都是包含在内的,不管怎么样。如果你想要其他的东西,你需要仔细考虑每一种情况。
您可能还需要询问日期,否则向用户说输入范围的消息将被视为同一天。 – kosa
我同意Nambari,如果您没有指定日期,那么您可以检查24小时标记上的重叠。一旦你有1天的时间,这会造成问题。 – calderonmluis