首頁 >後端開發 >C++ >如何在C#中高效率計算兩個日期之間的工作天數?

如何在C#中高效率計算兩個日期之間的工作天數?

Linda Hamilton
Linda Hamilton原創
2025-01-17 18:37:12594瀏覽

How to Efficiently Calculate the Number of Business Days Between Two Dates in C#?

C#中高效率計算兩個日期之間工作日數的方法

計算兩個日期之間的工作日數需要考慮週末和可能的假日。 C# 提供多種方法來完成此任務。

一種建議的解決方案利用 DateTime 類,避免低效率的逐日枚舉。此方法透過考慮完整週、部分週末和假日來計算指定時間間隔內工作日數。演算法如下:

  1. 使用 .Date 屬性將輸入日期轉換為對應的 DateTime 物件。
  2. 透過確保第一個日期小於或等於第二個日期來驗證輸入。
  3. 使用 TimeSpan 計算日期之間的跨度,並為每一天將工作日計數增加 1。
  4. 將工作天數除以 7 以決定區間內完整週數。
  5. 對於不適合完整週的剩餘天數,檢查它們是否落在週末(週六或週日)。如果是,則相應地減少工作日計數。
  6. 從完整週期間的總工作天數中減去週末數。
  7. 最後,迭代任何提供的假日,如果它們落在區間內,則從工作日計數中減去它們。

以下是解決方案的實作:

<code class="language-csharp">public static int BusinessDaysUntil(this DateTime firstDay, DateTime lastDay, params DateTime[] bankHolidays)
{
    firstDay = firstDay.Date;
    lastDay = lastDay.Date;
    if (firstDay > lastDay)
        throw new ArgumentException("Incorrect last day " + lastDay);

    TimeSpan span = lastDay - firstDay;
    int businessDays = span.Days + 1;
    int fullWeekCount = businessDays / 7;

    // 计算周末天数
    int weekendDays = fullWeekCount * 2;
    int remainingDays = businessDays % 7;
    int firstDayOfWeek = (int)firstDay.DayOfWeek;
    int lastDayOfWeek = (int)lastDay.DayOfWeek;

    if (remainingDays > 0)
    {
        if (lastDayOfWeek == 0) lastDayOfWeek = 7; // 将周日转换为7
        if (firstDayOfWeek == 0) firstDayOfWeek = 7; // 将周日转换为7

        if (lastDayOfWeek < 6)
            weekendDays += 0; // 如果最后一天不是周末,则不加周末天数
        else if (lastDayOfWeek == 6)
            weekendDays += 1; // 如果最后一天是周六,则加一天
        else
            weekendDays += 2; // 如果最后一天是周日,则加两天

        if (firstDayOfWeek == 7)
            weekendDays -= 1; // 如果第一天是周日,则减一天
        else if (firstDayOfWeek == 6)
            weekendDays -= 1; // 如果第一天是周六,则减一天

    }

    businessDays -= weekendDays;

    foreach (DateTime bankHoliday in bankHolidays)
    {
        DateTime bh = bankHoliday.Date;
        if (bh >= firstDay && bh <= lastDay)
            businessDays--;
    }

    return businessDays;
}</code>

以上是如何在C#中高效率計算兩個日期之間的工作天數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn