Itérer chaque jour entre StartDate et EndDate

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