Kim Ivan Bay-an
Kim Ivan Bay-an

Reputation: 85

How to count number Holidays between 2 dates C#

How can I count the number of holidays from database between 2 days

I already count the number of business days but how can i minus to week days the number of holidays counted between 2 days.

Assuming that I have a Holidays table with

Dates:

Answer should be: Business days - Holiday Number between 2 dates ;

Here's my code:

 public static void GetBusinessDays(DateTime startD, DateTime endD)
 {
            double calcBusinessDays =
                1 + ((endD - startD).TotalDays * 5 -
                (startD.DayOfWeek - endD.DayOfWeek) * 2) / 7;

            if (endD.DayOfWeek == DayOfWeek.Saturday) calcBusinessDays--;
            if (startD.DayOfWeek == DayOfWeek.Sunday) calcBusinessDays--;

            MessageBox.Show(" " + calcBusinessDays);
        } 

from this link :Calculate the number of business days between two dates?

Button:

 private void button1_Click(object sender, EventArgs e)
        {
            GetBusinessDays(Convert.ToDateTime(metroDateTime1.Value.ToString("yyyy-MM-dd")), Convert.ToDateTime(metroDateTime2.Value.ToString("yyyy-MM-dd")));
        }

PS: I'm new to c#

Upvotes: 0

Views: 1251

Answers (1)

Ashkan Mobayen Khiabani
Ashkan Mobayen Khiabani

Reputation: 34160

While only

while (Start.Date <= End.Date) 
{ 
    if (Start.DayOfWeek == DayOfWeek.Saturday || Start.DayOfWeek == DayOfWeek.Sunday) 
        holidays++; 
    Start = Start.AddDays(1);
}

Could calculate the holiday count, but the code below is more efficient, as we already know that every 7 days has 2 holiday in it and don't have to go through it and only checking days % 7 (6 days at most) for holidays is enough.

int days = (int)(End - Start).TotalDays + 1;
        int holidays = days / 7 * 2;
        int remain = days % 7;
        DateTime dt = End.AddDays(-remain);
        while (dt.Date <= End.Date)
        {
            if (dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday)
                holidays++;
            dt = dt.AddDays(1);
        }
        int year = Start.Year;
        do
        {
            dt = new DateTime(year, 12, 25); //is chritsmass right?
            if (dt >= Start && dt <= End && dt.DayOfWeek!=DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday) holidays++;
            dt = new DateTime(year, 7, 4); // 4th of july
            if (dt >= Start && dt <= End && dt.DayOfWeek!=DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday) holidays++;
            dt = new DateTime(year, 10, 31); // holoween
            if (dt >= Start && dt <= End && dt.DayOfWeek!=DayOfWeek.Saturday && dt.DayOfWeek != DayOfWeek.Sunday) holidays++;
            year++;
        } while (year <= End.Year);
        int businessDays = days - holidays;

Live Demo

Upvotes: 1

Related Questions