计算两个日期之间的天数和小时数,并考虑周末(仅工作日)

本文关键字:周末 工作日 小时 两个 日期 之间 计算 | 更新日期: 2023-09-27 18:19:09

我想这样做:

var startDate = DateTime.Now
var durationDays = 2
var expectedEndDate = startDate.AddDays(durationDays)

但如果在这些天之间有周末,则将它们贴现为天。因此,如果预期的结束日期是星期六,那么结束日期需要在接下来的星期一。

计算两个日期之间的天数和小时数,并考虑周末(仅工作日)

根据您想要添加的天数作为最大值,您可以在while循环中检查该天,并通过AddDays添加另一天,只要expectedEndDate所在周的当前一天是周末。也许像这样:

DateTime startDate = DateTime.Now
int durationDays = 2
DateTime expectedEndDate = startDate.AddDays(durationDays)
while( expectedEndDate.DayOfWeek == DayOfWeek.Saturday ||
       expectedEndDate.DayOfWeek == DayOfWeek.Sunday )
{
    expectedEndDate.AddDays( 1 );
}

如果您需要一个更灵活的解决方案来处理多个周末的较大日期差异,那么另一篇文章的链接解决方案适合您(我试图保持简单:-))。

您也可以使用这种解决方案,如果您要检入更大的时间跨度,它应该更有效:计算两个日期之间的工作日数?

试试这个:

        var startDate = DateTime.Now;
        var durationDays = 2;
        var expectedEndDate = startDate.AddDays(durationDays);
        if (expectedEndDate.DayOfWeek == DayOfWeek.Saturday)
        {
            expectedEndDate = expectedEndDate.AddDays(2);
        }
        else
        {
            if (expectedEndDate.DayOfWeek == DayOfWeek.Sunday)
            {
                expectedEndDate = expectedEndDate.AddDays(1);
            }
        }

我试着改进@Gorgsenegger的答案:

    int iteration = 0;
        while (iteration < durationDays)
        {
            while (expectedEndDate.DayOfWeek != DayOfWeek.Saturday && expectedEndDate.DayOfWeek != DayOfWeek.Sunday)
            {
                expectedEndDate = expectedEndDate.AddDays(1);
                iteration++;
                if (iteration == durationDays) break;
            }
            if (iteration == durationDays) break;
            if (expectedEndDate.DayOfWeek == DayOfWeek.Saturday) expectedEndDate=expectedEndDate.AddDays(2);
            if (expectedEndDate.DayOfWeek == DayOfWeek.Sunday) expectedEndDate=expectedEndDate.AddDays(1);
        }
        if (expectedEndDate.DayOfWeek == DayOfWeek.Saturday)expectedEndDate= expectedEndDate.AddDays(2);
        if (expectedEndDate.DayOfWeek == DayOfWeek.Sunday) expectedEndDate=expectedEndDate.AddDays(1);

我认为这段代码可以处理所有情况