SORU
24 EKİM 2009, CUMARTESİ


İki tarih arasındaki iş günü sayısını hesaplamak?

C# nasıl sayısını hesaplayabilirsiniz(ya da hafta içi) iki tarih arasındaki gün?

Teşekkürler!

CEVAP
24 EKİM 2009, CUMARTESİ


Daha önce böyle bir görev aldım ve bir çözüm buldum. Bu durumda burada olan önlenebilir olduğu zaman arasında tüm gün, numaralandırma kaçınmak olacaktır. Cevapları bile birinin üstünde gördüm gibi DateTime örnekleri bir grup oluşturmak bahsetmek istemiyorum. Bu gerçekten işlem gücü kaybıdır. Özellikle birkaç ay zaman aralıkları incelemek için zaman gerçek dünya durumda. Benim kod, yorumlarla, aşağıya bakın.

    /// <summary>
    /// Calculates number of business days, taking into account:
    ///  - weekends (Saturdays and Sundays)
    ///  - bank holidays in the middle of the week
    /// </summary>
    /// <param name="firstDay">First day in the time interval</param>
    /// <param name="lastDay">Last day in the time interval</param>
    /// <param name="bankHolidays">List of bank holidays excluding weekends</param>
    /// <returns>Number of business days during the 'span'</returns>
    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;
        // find out if there are weekends during the time exceedng the full weeks
        if (businessDays > fullWeekCount*7)
        {
            // we are here to find out if there is a 1-day or 2-days weekend
            // in the time interval remaining after subtracting the complete weeks
            int firstDayOfWeek = (int) firstDay.DayOfWeek;
            int lastDayOfWeek = (int) lastDay.DayOfWeek;
            if (lastDayOfWeek < firstDayOfWeek)
                lastDayOfWeek  = 7;
            if (firstDayOfWeek <= 6)
            {
                if (lastDayOfWeek >= 7)// Both Saturday and Sunday are in the remaining time interval
                    businessDays -= 2;
                else if (lastDayOfWeek >= 6)// Only Saturday is in the remaining time interval
                    businessDays -= 1;
            }
            else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)// Only Sunday is in the remaining time interval
                businessDays -= 1;
        }

        // subtract the weekends during the full weeks in the interval
        businessDays -= fullWeekCount   fullWeekCount;

        // subtract the number of bank holidays during the time interval
        foreach (DateTime bankHoliday in bankHolidays)
        {
            DateTime bh = bankHoliday.Date;
            if (firstDay <= bh && bh <= lastDay)
                --businessDays;
        }

        return businessDays;
    }
< / ^ hr .

Slauma, Ağustos 2011 yılına kadar düzenlemek

Harika cevap! Ama küçük bir hata var. Özgürlük muhatap 2009 yılından bu yana olmadığı için bu cevap düzenlemek için alıyorum.

Yukarıdaki kod DayOfWeek.Sunday zaman değeri 7 olduğunu varsayar. Değeri aslında 0. Örneğin firstDay lastDay aynı Pazar günü ise iki yanlış bir hesaplama yol açar. Yöntem bu durumda 1 döner ama 0 olmalıdır.

En kolay bu hata için düzeltme: firstDayOfWeek lastDayOfWeek aşağıdaki tarafından bildirilir satırları yukarıdaki kodu Değiştirin:

int firstDayOfWeek = firstDay.DayOfWeek == DayOfWeek.Sunday 
    ? 7 : (int)firstDay.DayOfWeek;
int lastDayOfWeek = lastDay.DayOfWeek == DayOfWeek.Sunday
    ? 7 : (int)lastDay.DayOfWeek;

Şimdi sonucudur:

  • Cuma Cuma ->1
  • Cumartesi Cumartesi ->0
  • Pazar pazar ->0
  • Cumartesi için Cuma ->1
  • Cuma-pazar ->1
  • Pazartesi-Cuma ->2
  • Pazartesi-Cumartesi ->1
  • Pazartesi-pazar ->1
  • Pazartesi Pazartesi ->1

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • sk8ingis4me

    sk8ingis4me

    16 Mart 2006
  • WiseOwlTutorials

    WiseOwlTutor

    21 EKİM 2011