检查一个时间范围是否进入另一个

时间:2014-01-29 06:55:49

标签: c#

我有两个日期变量: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;

但是,此代码并未涵盖所有变体。

3 个答案:

答案 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;
}