我有一个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进行迭代。
答案 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);
}