Nombre de jours dans la plage de dates, hors week-end et d'autres dates, en C#
J'ai une méthode C# comme ceci:
public static int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, String excludeDates)
{
}
Ce qu'il est censé faire est de calculer le nombre de jours entre la date de début et date de fin, mais éventuellement besoin d'exclure les week-ends et aussi d'autres dates (transmis sous la forme d'une chaîne séparée par des virgules de dates).
Je n'ai absolument aucune idée de comment y remédier. Mon instinct serait de boucle de date de début à la date de fin et de faire quelques comparaisons de chaînes, mais de ce que je peux trouver, C# ne permet pas de boucle sur les dates de cette façon - ou, au moins, elle n'est pas très élégante façon de faire les choses.
une meilleure O(1) solution peut être trouvée ici: stackoverflow.com/questions/1044688
OriginalL'auteur Dan | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Voici un exemple qui comprend les dates d'exclusion, les week-ends, et en boucle. J'ai fait changer la chaîne excludeDates à une Liste même si. Certains null vérification doit être ajouté.
EDIT: je ne veux point que je voudrais considérer que c'est rapide et sale de la méthode si vous n'avez pas à le faire souvent. Si vous effectuez cette beaucoup et la distance entre les date de début et date de fin est plutôt grand, il serait beaucoup mieux de faire le calcul comme indiqué dans l'une des autres réponses. Ceci est suggéré afin d'obtenir une sensation pour l'itération dates.
for (int i = 0; i < excludeDates.Count; i++) {...}
vous pouvez simplement cocherexcludeDates.Contents(index)
puis tout le code peut être simplifié à seulement 2 lignesif (excludeWeekends && index.DayOfWeek != DayOfWeek.Sunday && index.DayOfWeek != DayOfWeek.Saturday && !excludeDates.Contains(index)) count++;
OriginalL'auteur McAden
Oh il est vraiment facile à boucle à travers les dates - qui n'est pas du tout un problème:
Vous pouvez facilement écrire un
IEnumerable<DateTime>
trop, et l'utilisationforeach
.Je voudrais essayer d'éviter de faire chaîne opérations ici, si possible, bien que, fondamentalement, ces dates ne sont pas des chaînes, donc si vous pouvez travailler dans le domaine du problème autant que possible, il va rendre les choses plus faciles.
Bien sûr, il peut y avoir des moyens plus efficaces que la boucle, mais ils seront plus difficiles à obtenir le droit. Si la boucle est acceptable en termes de performances, je collerais.
Comme un petit plug pour mon propre projet open source, Noda Temps a plutôt un ensemble plus diversifié de types représentant les dates et les heures - dans ce cas, vous pourriez utiliser une
LocalDate
. De cette façon, vous n'avez pas à vous soucier de ce qui se passe si le temps dans "démarrer" est plus tard que l'heure de la "fin" etc. D'autre part, Noda Temps n'est pas vraiment encore fini... les éléments dont vous avez besoin pour cela d'être prêt et devrait fonctionner correctement, mais il est possible que l'API peut encore changer à l'avenir.EDIT: Si vous ne besoin d'une boucle sur les dates fréquemment, vous pourriez voulez quelque chose comme cette méthode d'extension (le mettre dans un niveau supérieur non générique statique de la classe):
Alors:
Exclure les dates peuvent relèvent pas nécessairement de début et dates de fin, donc il faut vérifier ici - qui est une partie de la difficulté et ne me permet pas de le faire de la manière que vous proposez.
OriginalL'auteur Jon Skeet
La Subsonique sucre bibliothèque a beaucoup d'aides pour gérer DateTime manipulation.
Vous pouvez trouver une liste complète sur le Subsonic site et le code source est dans github.
OriginalL'auteur marto
Voici pseudocode pour une approche différente que j'ai utilisé en SQL:
Trouver le nombre total de jours entre deux dates
Soustraire le nombre de week-ends
Retirer un jour si la date de début est un dimanche
Retirer un jour si la date de début est un samedi
Supprimer tous les autres jours, vous ne voulez pas (voir mon commentaire ci-dessus pour savoir comment faire cela en c#)
OriginalL'auteur macleojw
Cela pourrait fonctionner et éviter un O(n) type de solution:
Ses pas testés de manière exhaustive.
Pour gérer les exclusions dates que vous pourriez boucle par ceux et exclure où ils sont entre le début et la fin (et pas un week-end, le cas échéant). Ce doit être une boucle plus courte que d'aller à travers tous les jours entre le début et la fin.
OriginalL'auteur Jon Egerton
Combiner avec des expressions LINQ,
OriginalL'auteur Jedi Dula
OriginalL'auteur dbhukta