Ответ 1
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1))
{
...
}
.Date должен убедиться, что у вас есть этот последний день, как в примере.
У меня есть DateTime
StartDate и EndDate.
Как я могу, независимо от времени, перебирать каждый день между этими двумя?
Пример: StartDate - 20.07.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))
{
...
}
Другим преимуществом этого подхода является то, что он делает тривиальным добавление EveryWeek, EveryMonth и т.д. Затем они будут доступны в DateTime.
Вы должны быть осторожны с датой окончания. Например, в
Пример: StartDate - 20.07.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 вечера - становится 7/29 5:10 вечера, что выше, чем 7/29 2 утра.
Если это не то, что вы хотите, я бы сказал, что вы
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.MaxValue
.
Чтобы предотвратить это, добавьте дополнительную проверку в конце цикла
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1))
{
...
if (date.Date == DateTime.MaxValue.Date)
{
break;
}
}
(Я бы разместил это в качестве комментария к @Yuriy Faktorovich, но мне не хватает репутации)