2014-01-29 121 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)); 

但使用日期数学的时候,我尝试尽可能详细。

相关问题