Подтвердить что ты не робот

Итерации в течение каждого дня между StartDate и EndDate

У меня есть 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.

4b9b3361

Ответ 1

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

.Date должен убедиться, что у вас есть этот последний день, как в примере.

Ответ 2

Альтернативным методом, который может быть более многоразовым, является запись метода расширения в 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.

Ответ 3

Вы должны быть осторожны с датой окончания. Например, в

Пример: 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());
}

или что-то в этом роде.

Ответ 4

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

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

Ответ 5

Петли @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, но мне не хватает репутации)