C# 取得兩日期間隔天數和不包含六日的天數

取得間隔天數

一般情況下最簡單取得間隔天數的方式就是使用 TimeSpan:
    
DateTime startDate = new DateTime(2023, 1, 1);
DateTime endDate = new DateTime(2023, 1, 20);

TimeSpan interval = endDate - startDate;

Console.WriteLine($"總天數(double): {interval.TotalDays}"); // 19
Console.WriteLine($"天數(int): {interval.Days}"); // 19
    

需要注意的是 TotalDays 和 Days 都不會包含結束的那天,如果要包含結束的那天則要自己再 +1 ,這樣 1 ~ 20 號才會是 20 天。

另外如果不足一天的話 Days 就會被無條件捨去,所以只要有包含時間的話 Days 顯示的天數基本上就會再少一天:
    
DateTime startDate = new DateTime(2023, 1, 1, 22, 57, 57);
DateTime endDate = new DateTime(2023, 1, 20);

TimeSpan interval = endDate - startDate;

Console.WriteLine($"總天數(double): {interval.TotalDays}"); // 18.04309027777778
Console.WriteLine($"天數(int): {interval.Days}"); // 18
Console.WriteLine($"小時: {interval.Hours}"); // 1
Console.WriteLine($"分鐘: {interval.Minutes}"); // 2
Console.WriteLine($"秒: {interval.Seconds}"); // 3
    

取得扣除六日的間隔天數

好像沒有什麼內建的方法可以快速的取得扣除六日的間隔日期天數,不過寫起來也不難。並且在這個自訂的方法中還加了一個 bool 用來控制是否要計算結束的那一天:
    
/// <summary>
/// 計算不包含六日的間隔天數
/// </summary>
/// <param name="start">開始日期</param>
/// <param name="end">結束日期</param>
/// <param name="includeEndDate">是否包含結束日期</param>
/// <returns></returns>
int CalculateWorkingDays(DateTime start, DateTime end, bool includeEndDate = false)
{
    if (includeEndDate) end = end.AddDays(1);
    var workingDays = 0;
    for (var date = start; date < end; date = date.AddDays(1))
    {
        if (date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday) continue;
        workingDays++;
    }

    return workingDays;
}


DateTime startDate = new DateTime(2023, 1, 1);
DateTime endDate = new DateTime(2023, 1, 20);

int workingDays = CalculateWorkingDays(startDate, endDate);
Console.WriteLine($"不包括星期六和星期日的天數是:{workingDays}"); // 14
    

註: 2023/01/01 是星期日

參考資料:
Microsoft.Learn - TimeSpan Struct

留言