迭代StartDate和EndDate之间的每一天

我有一个DateTime StartDate和EndDate。

我怎样才能,无论如何,在这两者之间的每一天迭代?

例如:StartDate是7/20/2010 5:10:32 PM,EndDate是7/29/2010 1:59:12 AM。

我希望能够遍历7/20,7 / 21,7 / 22 .. 7/29。

 for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) { ... } 

.Date是为了确保你有最后一天,就像在这个例子中。

另一种更可重用的方法是在DateTime上编写一个扩展方法,并返回一个IEnumerable。

例如,你可以定义一个类:

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

现在在调用代码中,您可以执行以下操作:

 DateTime start = DateTime.Now; DateTime end = start.AddDays(20); foreach (var day in start.EachDay(end)) { ... } 

这种方法的另一个好处是,它使微不足道的添加EachWeek,EachMonth等。这些都将可以在DateTime上访问。

你必须小心结束date。 例如,在

例如:StartDate是7/20/2010 5:10:32 PM,EndDate是7/29/2010 1:59:12 AM。
我希望能够遍历7/20,7 / 21,7 / 22 .. 7/29。

date < endDate将不会包含7/29。 当你添加1天到7/28 5:10 PM – 它变成7/29 5:10 PM,高于7/29 2 AM。

如果这不是你想要的,那么我会说你这样做

 for (DateTime date = start.Date; date <= end.Date; date += TimeSpan.FromDays(1)) { Console.WriteLine(date.ToString()); } 

或者这个效果的东西。

 DateTime date = DateTime.Now; DateTime endDate = date.AddDays(10); while (date < endDate) { Console.WriteLine(date); date = date.AddDays(1); } 

@Yuriy Faktorovich,@healsjnr和@mho的循环将全部抛出一个System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime如果EndDate == DateTime.MaxValueSystem.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTimeexception。 为了防止这种情况,在循环结尾添加一个额外的检查

 for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) { ... if (date.Date == DateTime.MaxValue.Date) { break; } } 

(我会张贴这个评论@Yuriy Faktorovich的答案,但我缺乏声誉)