我有一个只能在特定时间范围内执行的函数。用户可以通过输入开始和结束时间来指定这个时间范围。
我遇到的问题是时间范围跨越几天。例如:开始范围小时:18(18:00 下午 6 点) 结束范围小时:6(06:00 上午 6 点)
一个简单的:
if( hour >= startrange && hour <= endrange ) { now in range }
在这种情况下不起作用。
我发现很难为这个问题想出一个解决方案。也许今天我的头脑已经足够了。( ;) )
谁能给我指个方向?
如果 startrange > endrange,则必须更改 if 子句。所以:
if (startrange > endrange) {
if (hour > startrange`) hour = hour -24;
startrang = startrange -24;
}
if( hour >= startrange && hour <= endrange ) { now in range }
首先,我会使用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;
}
棘手的一点是平等。上面的代码假定起点/终点都包含在内,无论哪种方式。如果您想要其他任何东西,则需要非常仔细地考虑每种情况。