我有一个只能在特定时间范围内执行的功能。用户可以通过输入开始和结束时间来指定此时间范围。
我碰到的问题是时间范围跨越几天。例如: 开始时间:18(下午18:00) 结束时间:6(06:00 6 am)
简单:
if( hour >= startrange && hour <= endrange ) { now in range }
在这种情况下不起作用。
我发现很难找到解决这个问题的方法。也许我的思想今天已经足够了。 (;))
任何人都能指出我的方向吗?
答案 0 :(得分:1)
如果startrange&gt; endrange,你必须改变if子句。 所以:
if (startrange > endrange) {
if (hour > startrange`) hour = hour -24;
startrang = startrange -24;
}
if( hour >= startrange && hour <= endrange ) { now in range }
答案 1 :(得分:0)
首先,我使用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;
}
棘手的一点是平等。上面的代码假定开始/结束点都包括在内,无论是哪种方式。如果你还需要其他任何东西,你需要仔细考虑每种情况。