7
votes

Nombre de jours de date à la date, à l'exclusion des week-ends et autres dates, en C #

J'ai une méthode C # comme ceci:

public static int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, String excludeDates)
{
}


1 commentaires

Une meilleure solution O (1) peut être trouvée ici: Stackoverflow.com/Questtions/1044688


7 Réponses :


1
votes

La bibliothèque sucre subsonique a beaucoup d'aide pour gérer la manipulation de DateTime.

Vous pouvez trouver une liste complète sur le site site subsonique et le code source est dans Github .


0 commentaires

11
votes

Oh, c'est vraiment facile de boucler à travers les dates - ce n'est pas un problème du tout: xxx

Vous pouvez facilement écrire un ienumerable aussi, et Utilisez foreach .

J'essayerais d'éviter de faire String les opérations ici si possible mais fondamentalement, ces dates ne sont pas des cordes, donc si vous le pouvez Travaillez dans le domaine du problème aussi loin que possible, cela facilitera les choses.

Bien sûr, il pourrait bien y avoir des moyens plus efficaces que de boucler, mais ils seront plus difficiles à obtenir. Si la boucle va bien en termes de performance, je m'engendrais à cela.

comme une prise rapide pour mon propre projet open source, Time noda a un ensemble de types plutôt plus diversifiés représentant les dates et les heures - dans ce cas, vous utiliseriez localDate . De cette façon, vous n'avez pas à vous soucier de ce qui se passe si le temps de "start" est plus tard que le temps de "fin", etc. D'autre part, le temps de noda n'est pas vraiment fini ... Les bits dont vous avez besoin. car cela est prêt et devrait fonctionner correctement, mais il est possible que l'API puisse toujours changer à l'avenir.

EDIT: Si vous DO Besoin de boucler des dates fréquemment, vous voudrez peut-être vouloir Quelque chose comme cette méthode d'extension (mettez-le dans une classe statique non générique de haut niveau): xxx

alors: xxx < / p>


2 commentaires

Pour éviter la comparaison des chaînes pour l'exclusion des dates, tout ce que vous avez à faire est de trouver le nombre de dates que vous excluez (en supposant qu'il n'y ait pas de week-end) que vous pouvez découvrir avec: exclludedates.split (','). Longueur. Puis soustrayez cela du nombre de jours.


Les dates d'exclusion ne sont peut-être pas nécessairement obstruées dans les dates de début et de fin, il faut donc un chèque ici - qui fait partie de la difficulté et des moyens que je ne peux pas le faire comme vous le suggérez.




10
votes

Voici un exemple qui comprend les dates, les week-ends et la boucle exclus. J'ai changé la chaîne exclore cependant une liste. Une vérification nulle doit être ajoutée.

    public static int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, List<DateTime> excludeDates)
    {
        int count = 0;
        for (DateTime index = startDate; index < endDate; index = index.AddDays(1))
        {
            if (excludeWeekends && index.DayOfWeek != DayOfWeek.Sunday && index.DayOfWeek != DayOfWeek.Saturday)
            {
                bool excluded = false; ;
                for (int i = 0; i < excludeDates.Count; i++)
                {
                    if (index.Date.CompareTo(excludeDates[i].Date) == 0)
                    {
                        excluded = true;
                        break;
                    }
                }

                if (!excluded)
                {
                    count++;
                }
            }
        }

        return count;
    }


1 commentaires

Au lieu de faire une boucle pour (int i = 0; i Vous pouvez simplement vérifier exclludeates.contents (index) et Ensuite, le code entier pourrait être simplifié à seulement 2 lignes si (exclutwekends && index.dayofeek! = Dayofweek.sunday && Index.dayofeek! = Dayofweek.Saturday &&! Exclusedats.Contains (index)) Comptez ++;



0
votes

Ceci pourrait fonctionner et éviter une solution de type O (N):

public int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, String excludeDates)
{

    //Work out days in range
    int days = (int)endDate.Subtract(startDate).TotalDays + 1;

    if (excludeWeekends)
    {
        //Remove most weekends by removing 2 in 7 days (rounded down)
        days -= ((int)Math.Floor((decimal)(days / 7)) * 2);

        if (startDate.DayOfWeek == DayOfWeek.Sunday) days -= 1;
        if (startDate.DayOfWeek == DayOfWeek.Saturday) days -= 2;
    }                  

    return days;

}


0 commentaires

0
votes

combiner avec des expressions LINQ,

        public int GetNoOfLeaveDays(DateTime fromDate, DateTime toDate, Boolean excludeWeekends, List<DateTime> excludeDates)
    {
        var count = 0;
        for (DateTime index = fromDate; index <= toDate; index = index.AddDays(1))
        {
            if (!excludeWeekends || index.DayOfWeek == DayOfWeek.Saturday || index.DayOfWeek == DayOfWeek.Sunday) continue;
            var excluded = excludeDates.Any(t => index.Date.CompareTo(t.Date) == 0);
            if (!excluded) count++;
        }
        return count;
    }


0 commentaires

0
votes
private int workingdays(int month,int year)
{
    int daysInMonth = 0;
    int days = DateTime.DaysInMonth(year, month);
    for (int i = 1; i <= days; i++)
    {
        DateTime day = new DateTime(year, month, i);
        if (day.DayOfWeek != DayOfWeek.Sunday && day.DayOfWeek != DayOfWeek.Saturday)
        {
            daysInMonth++;
        }
    }
    return daysInMonth;
}

0 commentaires