在StartDate和EndDate之间每天迭代

时间:2010-07-29 05:46:09

标签: c# .net datetime

我有一个DateTime StartDate和EndDate。

无论何时,我如何在这两者之间每天重复一次?

  

示例:StartDate是2010年7月20日下午5:10:32,EndDate是2010年7月29日   1:59:12 AM。

我希望能够跨越7 / 20,7 / 21,7 / 22 .. 7/29进行迭代。

5 个答案:

答案 0 :(得分:122)

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

.Date是为了确保你拥有最后一天,就像在示例中一样。

答案 1 :(得分:13)

可能更可重用的替代方法是在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))
{
    ...
}

这种方法的另一个优点是它使添加EveryWeek,EachMonth等变得微不足道。然后,这些都可以在DateTime上访问。

答案 2 :(得分:3)

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

  

示例:StartDate是2010年7月20日下午5:10:32,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点。

如果那不是你想要的那么我会说你做了

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

或其他相似之处。

答案 3 :(得分:3)

@Yuriy Faktorovich,@ hersjnr和@mho的循环都会抛出一个System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime 如果EndDate == DateTime.MaxValue,则例外。 为防止这种情况,请在循环结束时添加额外的检查

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

(我会将此作为对@Yuriy Faktorovich的回答发表评论,但我缺乏声誉)

答案 4 :(得分:0)

DateTime date = DateTime.Now;
DateTime endDate = date.AddDays(10);

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