2012-11-01 50 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

我也想感謝你的回覆。這是相當廣泛的,即使我理解代碼背後的想法和邏輯。 –