2012-11-01 56 views
1

我有一个函数,它只能在特定的时间范围内执行。用户可以通过输入开始和结束时间来指定此时间范围。跨越2天的时间范围?

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

一个简单的:

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

不会在这种情况下工作。

我很难找出解决这个问题的办法。也许我的思想已经足够今天。 (;))

任何人都可以指向我的方向吗?

+0

您可能还需要询问日期,否则向用户说输入范围的消息将被视为同一天。 – kosa

+0

我同意Nambari,如果您没有指定日期,那么您可以检查24小时标记上的重叠。一旦你有1天的时间,这会造成问题。 – calderonmluis

回答

1

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

if (startrange > endrange) { 
    if (hour > startrange`) hour = hour -24; 
    startrang = startrange -24; 
} 
if(hour >= startrange && hour <= endrange) { now in range } 
+0

谢谢你的回复。我特别喜欢你的解决方案的简单性。 –

+1

我想你的意思是最后的检查是在* if之外。 –

+0

它没有任何伤害,但是它应该是;-) –

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点)的而不是,则范围内(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; 
} 

棘手位是平等的。上面的代码假设开始/结束点都是包含在内的,不管怎么样。如果你想要其他的东西,你需要仔细考虑每一种情况。

+0

但是,这是如何解决跨越一天的时间?当输入只是2,6等, – kosa

+0

@Nambari:阅读扩展的答案。 –

+0

我也想感谢你的回复。这是相当广泛的,即使我理解代码背后的想法和逻辑。 –