Как получить все даты между двумя конкретными датами в С#
Я пытаюсь добавить все даты между двумя указанными датами. Вместо девяти разных дат я получаю 875287 и, очевидно, также получаю исключение из памяти из памяти. Где ошибка в этом коде?
StartDate
Значение 01/04/2016 00:00:00
EndDate
Значение 10/04/2016 00:00:00
var selectedDates = new List<DateTime?>();
for (var date = StartDate; date <= EndDate; date.Value.AddDays(1))
{
selectedDates.Add(date);
}
Ответы
Ответ 1
Вы не присваиваете значение date.Value.AddDays(1)
чему-либо, поэтому оно заканчивается бесконечным циклом. Вам нужно будет изменить код, чтобы date
был установлен на результат AddDays
.
for (var date = StartDate; date <= EndDate; date = date.AddDays(1))
{
selectedDates.Add(date);
}
Ответ 2
решение LINQ (пусть сгенерирует selectedDates
):
var selectedDates = Enumerable
.Range(0, int.MaxValue)
.Select(index => new DateTime?(StartDate.AddDays(index)))
.TakeWhile(date => date <= EndDate)
.ToList();
Ответ 3
Насколько я вижу, поскольку AddDays
метод возвращает новый экземпляр DateTime
, он не изменяет текущий экземпляр, поскольку DateTime
immutable.
Похоже, что ваш date
равен DateTime?
, вы можете изменить эту часть как:
for (var date = StartDate; date <= EndDate; date = date.Value.AddDays(1))
{
selectedDates.Add(date);
}
Как указано в USR, это может повлиять на DST. Возможно, вы захотите проверить ответ Дмитрия.
Ответ 4
Более короткая нотация с использованием метода Linq Range использует возможность уже определить количество дней, используя свойство TimeSpan.Days
после вычитания начала с конца.
Предполагая, что начало до конца, вы закончите:
DateTime StartDate = new DateTime(1979, 10, 4);
DateTime EndDate = new DateTime(2016, 10, 4);
var dates = Enumerable.Range(0, (EndDate - StartDate).Days + 1)
.Select(day => StartDate.AddDays(day))
Если вам нужно, чтобы он был Nullable, добавьте:
.Cast<DateTime?>()
Если вам нужно, чтобы это был список, добавьте:
.ToList()
Это, вероятно, немного более эффективно, чем другое решение на базе LINQ.
Ответ 5
Решено изменить его с помощью do/while
var selectedDates = new List<DateTime?>();
DateTime? StartDate = DateTime.Parse("01/04/2016 00:00:00");
DateTime? EndDate = DateTime.Parse("10/04/2016 00:00:00");
do
{
selectedDates.Add(StartDate);
StartDate = StartDate.Value.AddDays(1);
}while(StartDate < EndDate);