J’ai un DateDate StartDate et EndDate.
Comment puis-je, quel que soit le temps, parcourir chaque jour entre les deux?
Exemple: StartDate est le 20/07/2010 17h10: 32 et EndDate est le 7/29/2010 01:59:12 AM.
Je veux pouvoir parcourir 7/20, 7/21, 7/22 .. 7/29.
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) { ... }
La date est de vous assurer que vous avez ce dernier jour, comme dans l'exemple.
Une autre méthode qui pourrait être plus réutilisable consiste à écrire une méthode d’extension sur DateTime et à retourner un IEnumerable.
Par exemple, vous pouvez définir une classe:
public static class MyExtensions { public static IEnumerable EachDay(this DateTime start, DateTime end) { // Remove time info from start date (we only care about day). DateTime currentDay = new DateTime(start.Year, start.Month, start.Day); while (currentDay <= end) { yield return currentDay; currentDay = currentDay.AddDays(1); } } }
Maintenant, dans le code d'appel, vous pouvez effectuer les opérations suivantes:
DateTime start = DateTime.Now; DateTime end = start.AddDays(20); foreach (var day in start.EachDay(end)) { ... }
Un autre avantage de cette approche est qu’il est sortingvial d’append EachWeek, EachMonth, etc. Celles-ci seront alors toutes accessibles sur DateTime.
Vous devez faire attention à la date de fin. Par exemple, dans
Exemple: StartDate est le 20/07/2010 17h10: 32 et EndDate est le 7/29/2010 01:59:12 AM.
Je veux pouvoir parcourir 7/20, 7/21, 7/22 .. 7/29.
date < endDate
n'inclura jamais le 7/29. Lorsque vous ajoutez 1 jour à 28/07 17h10 - il devient 7/29 17h10, ce qui est supérieur à 7/29 2 AM.
Si ce n'est pas ce que vous voulez, alors je dirais que vous faites
for (DateTime date = start.Date; date <= end.Date; date += TimeSpan.FromDays(1)) { Console.WriteLine(date.ToString()); }
Ou quelque chose à cet effet.
Les boucles de @Yuriy Faktorovich, @healsjnr et @mho lanceront toutes une System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime
exception System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime
si EndDate == DateTime.MaxValue
. Pour éviter cela, ajoutez une vérification supplémentaire à la fin de la boucle
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) { ... if (date.Date == DateTime.MaxValue.Date) { break; } }
(J'aurais posté ceci comme un commentaire à la réponse de @Yuriy Faktorovich, mais je manque de réputation)
DateTime date = DateTime.Now; DateTime endDate = date.AddDays(10); while (date < endDate) { Console.WriteLine(date); date = date.AddDays(1); }