是否跨越2天的时间范围?

时间:2012-11-01 15:45:02

标签: java date time

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

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

简单:

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

在这种情况下不起作用。

我发现很难找到解决这个问题的方法。也许我的思想今天已经足够了。 (;))

任何人都能指出我的方向吗?

2 个答案:

答案 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;
}

棘手的一点是平等。上面的代码假定开始/结束点都包括在内,无论是哪种方式。如果你还需要其他任何东西,你需要仔细考虑每种情况。