我有两个日期变量:startWork
和endWork
。
我需要定义一个人是否包括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;
但是,此代码并未涵盖所有变体。
答案 0 :(得分: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
答案 1 :(得分: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));
但是在使用日期数学时,我尽量做到详细。
答案 2 :(得分: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;
}