Maison > développement back-end > C++ > Comment calculer efficacement le nombre de jours ouvrables entre deux dates en C# ?

Comment calculer efficacement le nombre de jours ouvrables entre deux dates en C# ?

Linda Hamilton
Libérer: 2025-01-17 18:37:12
original
636 Les gens l'ont consulté

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

Comment calculer efficacement le nombre de jours ouvrés entre deux dates en C#

Le calcul du nombre de jours ouvrés entre deux dates prend en compte les week-ends et les éventuels jours fériés. C# propose plusieurs façons d’accomplir cette tâche.

Une solution suggérée utilise la classe DateTime pour éviter une énumération quotidienne inefficace. Cette méthode calcule le nombre de jours ouvrables dans un intervalle spécifié en prenant en compte les semaines complètes, les week-ends partiels et les jours fériés. L'algorithme est le suivant :

  1. Utilisez l'attribut .Date pour convertir la date d'entrée en l'objet DateTime correspondant.
  2. Validez la saisie en vous assurant que la première date est inférieure ou égale à la deuxième date.
  3. Utilisez TimeSpan pour calculer l'intervalle entre les dates et incrémenter le nombre de jours de la semaine de 1 pour chaque jour.
  4. Divisez le nombre de jours ouvrables par 7 pour déterminer le nombre de semaines complètes dans l'intervalle.
  5. Pour les jours restants qui ne rentrent pas dans une semaine complète, vérifiez s'ils tombent un week-end (samedi ou dimanche). Si tel est le cas, réduisez le nombre de jours ouvrables en conséquence.
  6. Soustrayez le nombre de week-ends du nombre total de jours ouvrables pendant la semaine complète.
  7. Enfin, parcourez tous les jours fériés fournis et soustrayez-les du nombre de jours de la semaine s'ils se situent dans l'intervalle.

Voici la mise en œuvre de la solution :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal