Как посчитать количество праздников между 2 датами C # - PullRequest
0 голосов
/ 30 сентября 2018

Как я могу посчитать количество выходных из базы данных за 2 дня

Я уже подсчитал количество рабочих дней, но как я могу минус дни недели, если количество выходных подсчитано между 2 днями.

Предполагая, что у меня есть таблица Holidays с

  • Хэллоуин 11-01
  • Рождество 12-25

Даты:

  • дата начала = 10-25
  • дата окончания = 01-30

Ответ должен быть таким: Рабочие дни - Число выходных между двумя датами;

Вот мой код:

 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);
        } 

по этой ссылке: Рассчитать количество рабочих дней между двумя датами?

Кнопка:

 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: я новичок в c #

1 Ответ

0 голосов
/ 30 сентября 2018

Пока только

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

Можно рассчитать количество выходных, но приведенный ниже код более эффективен, так как мы уже знаем, что каждые 7 дней в нем есть 2 выходных и не нужно их проходитьи достаточно только проверки days % 7 (максимум 6 дней) для праздников.

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

...