Получение всего DateTimes между двумя 'DateTime в C#

Я имею два DateTimes, и я хочу получить все DateTimes между этими Датами. Такой как, если мои Даты похожи 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 на использование.

72
задан Peter Mortensen 22 April 2016 в 22:15
поделиться

5 ответов

Вы можете использовать объекты DateTime непосредственно в цикле вместо вашего int . DateTime.AddDays правильно обрабатывает конец месяца.

for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1))
    allDates.Add(date);
124
ответ дан 24 November 2019 в 12:30
поделиться

Как насчет чего-то вроде этого?

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. :)

.
66
ответ дан 24 November 2019 в 12:30
поделиться

Вот быстрое консольное приложение, чтобы продемонстрировать, как это сделать. Вместо этого используйте 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;
    }
}
1
ответ дан 24 November 2019 в 12:30
поделиться
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);
    }
}
9
ответ дан 24 November 2019 в 12:30
поделиться

Вы были так близки ... только не используйте день, используйте дату целиком.

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();
}
3
ответ дан 24 November 2019 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: