İki tarih arasındaki iş günü sayısını hesaplamak?
C# nasıl sayısını hesaplayabilirsiniziş(ya da hafta içi) iki tarih arasındaki gün?
Teşekkürler!
CEVAP
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
Nasıl PHP kullanarak iki tarih arasınd...
Nasıl JavaScript ile iki tarih arasınd...
Hafta sayısını hesaplamak tarih...
Nasıl iki tarih arasındaki farkı hesap...
Ne kadar zaman hesaplamak için iOS iki...