2014-01-29 124 views
1

我有兩個日期變量:startWorkendWork。 我需要確定人員是否包括在23小時至05小時內工作。 例如:
startWork.Hour | endWork.Hour | result檢查一個時間範圍進入另一個時間範圍

21    5   Yes 
    22    3   Yes 
    12    21   No 
    23    8   Yes 
    21    8   Yes 
    7    9   No 

我的代碼:

if(startWork.Hour >= 23 && startWork.Hour <=5) 
    return true; 

if(endWork.Hour >= 23 && endWork.Hour <=5) 
    return true; 

但是,這個代碼不覆蓋所有變體。

+1

我建議改變你的程序,以便存儲實際的DateTime值而不是僅僅幾個小時。 – Dai

回答

2

沒有辦法匹配X >= 22 AND x <= 6條件...

嘗試以下操作:

public static bool CheckWorkHours(int start, int end) 
{ 
    if(start >= 23 || start <= 5) 
     return true; 

    if(end >= 23 || end <= 5) 
     return true; 

    if(start < 23 && end > 5 && start > end) 
     return true; 

    return false; 
} 

快速測試你的樣本數據:

var input = new[] { 
    new { start = 21, end = 5}, 
    new { start = 22, end = 3}, 
    new { start = 12, end = 21}, 
    new { start = 23, end = 8}, 
    new { start = 21, end = 8}, 
    new { start = 7, end = 9}, 
}; 

foreach (var item in input) 
    Console.WriteLine("{0}-{1}: {2}", item.start, item.end, CheckWorkHours(item.start, item.end)); 

打印

21-5: True 
22-3: True 
12-21: False 
23-8: True 
21-8: True 
7-9: False 
+0

您的代碼按預期工作。謝謝。 – user348173

0

您應該在他的評論中使用戴建議的DateTime。

bool IsIn_23_To_5_Limits(DateTime startWork, DateTime endWork) 
{ 
    if (startWork >= endWork) 
    { 
     throw new ArgumentOutOfRangeException("You can't stop working before start working."); 
    } 

    // startWork after 23:00 
    // endWork before 05:00 
    // endWork is immediately on the next day after startWork 
    return startWork.Hour >= 23 && endWork.Hour < 5 && startWork.Day == endWork.Day - 1; 
} 
+0

你的代碼不包括5測試 – user348173

+0

你是對的,我沒有注意到。我認爲我們希望工作時間嚴格限制在23-5之內。 –

1

這是最好的,如果你可以用實際DateTime對象爲起點和終點的工作參數,因爲他們確實是在時間點。除非,你可以隨時添加24被滑過的值使它們線性的,是這樣的:

public bool CheckWorkHours(int start, int end, int checkStart, int checkEnd) 
{ 
    if (checkStart > checkEnd) 
     checkEnd += 24; 

    if (start > end) 
     end +=24; 

    //did he start working after (or on) checkEnd? 
    if (start >= checkEnd) 
     return false; 

    //did he end working before (or on) checkStart? 
    if (end <= checkStart) 
     return false; 

    // he did indeed work during the interval 
    return true; 
} 

現在的檢查是直線前進。如果該人員在間隔期間工作,則必須在間隔結束之前開始工作,並且必須在間隔開始後結束工作。 可在一個內膽表示,像

return ((start < checkEnd) && (end > checkStart)); 

但使用日期數學的時候,我嘗試儘可能詳細。

相關問題