78 votes

Obtenir tous les DateTimes entre deux DateTime en c #

J'ai deux DateTime, et je veux obtenir tous les DateTimes entre ces Dates. Tels que, si mes Dates sont comme 01.01.2010 - 05.01.2010, ma fonction doit retourner moi une liste de date (Liste) et il doit contenir le 01.01.2010, 02.01.2010, 03.01.2010, 04.01.2010, 05.01.2010 J'ai écrit une fonction comme ceci. Il fonctionne très bien, si mes dates dans un mois. Il l'habitude de travailler si mes dates d'être comme le 01.01.2010 - 05.02.2010. Parce que le mois a changé, et ma fonction cant gérer. Est-il une fonction en C# me renvoie toutes les dates entre deux dates? Ou comment puis-je gérer changement d'un mois?

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));
        }

EDIT: Question résolu, voir Tim Robinson réponse simple à utiliser.

139voto

Tim Robinson Points 28696

Vous pouvez utiliser les objets DateTime directement dans la boucle, à la place de vos int . DateTime.AddDays gère correctement le mois se termine.

 for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1))
    allDates.Add(date);
 

76voto

Matt Hamilton Points 98268

Que diriez-vous quelque chose comme ça?

 public IEnumerable<DateTime> DateRange(DateTime fromDate, DateTime toDate)
{
    return Enumerable.Range(0, toDate.Subtract(fromDate).Days + 1)
                     .Select(d => fromDate.AddDays(d));
}
 

Edit: Testé maintenant. :)

11voto

Darin Dimitrov Points 528142
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);
    }
}

6voto

Jamiec Points 35773

Tu étais si proche… n'utilise pas le jour, utilise la date entière.

 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();
}
 

2voto

slugster Points 27178

Voici une application pour console rapide expliquant comment procéder: utilisez plutôt 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;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X