1

我有一个只能在特定时间范围内执行的函数。用户可以通过输入开始和结束时间来指定这个时间范围。

我遇到的问题是时间范围跨越几天。例如:开始范围小时:18(18:00 下午 6 点) 结束范围小时:6(06:00 上午 6 点)

一个简单的:

if( hour >= startrange && hour <= endrange ) { now in range }

在这种情况下不起作用。

我发现很难为这个问题想出一个解决方案。也许今天我的头脑已经足够了。( ;) )

谁能给我指个方向?

4

2 回答 2

1

如果 startrange > endrange,则必须更改 if 子句。所以:

if (startrange > endrange) {
    if (hour > startrange`) hour = hour -24;
    startrang = startrange -24;
}
if( hour >= startrange && hour <= endrange ) { now in range }
于 2012-11-01T16:05:49.507 回答
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;
}

棘手的一点是平等。上面的代码假定起点/终点都包含在内,无论哪种方式。如果您想要其他任何东西,则需要非常仔细地考虑每种情况。

于 2012-11-01T15:47:52.007 回答