找出两次约会之间的工作日时间

本文关键字:之间 约会 工作日 时间 两次 | 更新日期: 2023-09-27 18:17:54

如何获得两个日期之间的工作日小时数?(有很多工作日的计算,但工作日的计算似乎不多——不是营业/开放时间,只是周末以外的时间)。

这是我的尝试——有更好的方法吗?
void Main()
{
    // Works
    DateTime start = new DateTime(2013,6,15,0,0,0); // Saturday
    DateTime end = new DateTime(2013,6,17,10,0,0);  // Monday   
    // Result = 10 (OK)
    GetBusinessHours(start, end).Dump();        
    // Bugs
    start = new DateTime(2013,6,14,0,0,0); // Friday
    end = new DateTime(2013,6,15,0,0,0); // Saturday
    // Result = 0 (Bug) - should be 24
    GetBusinessHours(start, end).Dump();        
}
public double GetBusinessHours(DateTime start, DateTime end)
{
    double result = (end - start).TotalHours;
    int weekendDays = Enumerable.Range(0, 1 + end.Subtract(start).Days).Select(offset => start.AddDays(offset)).Count(d => d.DayOfWeek == DayOfWeek.Sunday || d.DayOfWeek == DayOfWeek.Saturday);       
    double weekendDeltaHours = 0;
    if (start.DayOfWeek == DayOfWeek.Saturday ||
        start.DayOfWeek == DayOfWeek.Sunday)
    {           
        weekendDays--;
        weekendDeltaHours = start.Date.AddDays(1).Subtract(start).TotalHours;
    }
    else if (end.DayOfWeek == DayOfWeek.Saturday ||
            end.DayOfWeek == DayOfWeek.Sunday)
    {
        weekendDeltaHours = (end - end.Date).TotalHours;
    }
    result = result - (weekendDays * 24) - weekendDeltaHours;           
    return result;
}

(Props to Ani for Enumerable)范围技巧)。

找出两次约会之间的工作日时间

这不是最有效的方法,但它可以满足您的要求。

var end = DateTime.Now;
var start = end.AddDays(-100);
var weekend = new[] { DayOfWeek.Saturday, DayOfWeek.Sunday };
var count = Enumerable.Range(0, Convert.ToInt32(end.Subtract(start).TotalHours))
     .Count(offset => !weekend.Contains(start.AddHours(offset).DayOfWeek));

可能值得检查一下,对于int来说,小时数不会太大。然而,这意味着时间范围> 24.5万年!