Я имею два DateTime
s, и я хочу получить все DateTime
s между этими Датами. Такой как, если мои Даты похожи 01.01.2010 - 01.05.2010, моя функция должна возвратить меня список даты (Список), и это должно содержать 01.01.2010, 01.02.2010, 01.03.2010, 01.04.2010, и 01.05.2010.
Я записал функцию как это. Это хорошо работает, если мои даты находятся через месяц. Это не будет работать, если мои даты будут похожи 01.01.2010 - 02.05.2010. Поскольку месяц, измененный, и моя функция, не может обработать его. Существует ли функция в C#, который возвращает все даты между двумя датами? Или как я могу обработать изменение месяца?
public void GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
{
List<DateTime> allDates = new List<DateTime>();
int starting = startingDate.Day;
int ending = endingDate.Day;
for (int i = starting; i <= ending; i++)
{
allDates.Add(new DateTime(startingDate.Year, startingDate.Month, i));
}
Решенный вопрос, см. простой ответ Tim Robinson на использование.
Вы можете использовать объекты DateTime
непосредственно в цикле вместо вашего int
. DateTime.AddDays
правильно обрабатывает конец месяца.
for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1))
allDates.Add(date);
Как насчет чего-то вроде этого?
public IEnumerable<DateTime> DateRange(DateTime fromDate, DateTime toDate)
{
return Enumerable.Range(0, toDate.Subtract(fromDate).Days + 1)
.Select(d => fromDate.AddDays(d));
}
Edit: Tested now. :)
. Вот быстрое консольное приложение, чтобы продемонстрировать, как это сделать. Вместо этого используйте AddDays ()
:
class Program
{
static void Main(string[] args)
{
GetDates(new DateTime(2010, 1, 1), new DateTime(2010, 2, 5));
Console.ReadKey();
}
static List<DateTime> GetDates(DateTime startDate, DateTime endDate)
{
List<DateTime> dates = new List<DateTime>();
while ((startDate = startDate.AddDays(1)) < endDate)
{
dates.Add(startDate);
}
return dates;
}
}
public IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
{
if (endingDate < startingDate)
{
throw new ArgumentException("endingDate should be after startingDate");
}
var ts = endingDate - startingDate;
for (int i = 0; i < ts.TotalDays; i++)
{
yield return startingDate.AddDays(i);
}
}
Вы были так близки ... только не используйте день, используйте дату целиком.
static IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
{
List<DateTime> allDates = new List<DateTime>();
for (DateTime i = startingDate; i <= endingDate; i = i.AddDays(1))
{
allDates.Add(i);
}
return allDates.AsReadOnly();
}