Aan alle DateTimes tussen twee ‘DateTime’ s in C#

Ik heb twee DateTimes, en ik wil je alle DateTimes tussen deze Data. Zoals, als mijn Data zijn als 01.01.2010 – 05.01.2010, mijn functie moet terugkeren mij een lijst van datum (Lijst), en het moet bevatten 01.01.2010, 02.01.2010, 03.01.2010, 04.01.2010, en 05.01.2010.

Schreef ik een functie als deze. Het werkt prima, als mijn data in een maand. Het zal niet werken als mijn data zijn als 01.01.2010 – 05.02.2010. Omdat de maand veranderd, en mijn functie niet meer aankan. Is er een functie in C# retourneert alle data tussen twee data? Of hoe kan ik omgaan met een maand veranderen?

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

Vraag opgelost, zie Tim Robinson ‘ s antwoord is simpel om te gebruiken.



8 Replies
  1. 123

    Kunt u gebruik maken van DateTime objecten rechtstreeks in de loop, in plaats van uw int. DateTime.AddDays handgrepen maand eindigt goed.

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

    Over hoe zoiets als dit?

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

    Edit: nu Getest. 🙂

    • Net wat ik nodig had. Werkt en is erg netjes.
  3. 9
    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);
        }
    }
    • Mooi gebruik van rendement, shoulda gedacht.
  4. 3

    Je was zo dichtbij… gewoon niet gebruiken van de dag, gebruik de hele dag.

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

    Hier is een snelle console app te tonen hoe dat te doen – gebruik AddDays() plaats:

    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;
        }
    }
    • Damn, veel van de antwoorden op deze.
  6. 1

    Gegeven een lowerdate waarde en een hogere waarde in de String en een frequentie als de derde parameter van deze methode moet de terugkeer van een woordenboek van data; waar de sleutel is de start waarde van een datum bereik en de waarde van de desbetreffende bereik.
    Dit werkt prima als de frequentie per week of per maand – u kunt het aanpassen als per uw behoefte.
    De datum doorgegeven waarden moeten worden, in het juiste formaat of moet je misschien opmaken via tryParseExact of iets dergelijks.

        protected static Dictionary<DateTime, String> getDateRange(String lowerDate, String higherDate, String frequency)
        {
            DateTime startDate, endDate;
            startDate = Convert.ToDateTime(lowerDate);
            endDate = Convert.ToDateTime(higherDate);
    
            Dictionary<DateTime, String> returnDict = new Dictionary<DateTime, String>();
    
            while (frequency.Equals("weekly") ? (startDate.AddDays(7) <= endDate) : (startDate.AddMonths(1) <= endDate))
            {
                if (frequency.Equals("weekly"))
                {
                    returnDict.Add(startDate, startDate + "-" + startDate.AddDays(7));
                    startDate = startDate.AddDays(8);
                }
                if (frequency.Equals("monthly"))
                {
                    returnDict.Add(startDate, startDate + "-" + startDate.AddMonths(1));
                    startDate = startDate.AddMonths(1).AddDays(1);
                }
            }
    
            returnDict.Add(startDate, startDate + "-" + endDate);
    
            return returnDict;
        }
    • Neem de code zo dat de eerste regel van de functie is ook opgemaakt als code. Dit antwoord is niet het oplossen van de vraag, aangezien hij schrijft dat hij al twee DateTimes en wil een Lijst, maar uw functie neemt snaren in plaats van DateTimes en geeft een Woordenboek in plaats van een lijst. Ook wil hij elke dag tussen de begin-en einddatum, niet slechts één keer per week of eens per maand.
  7. 1

    De top-oplossingen zal mislukken als de datum bevat verschillende uren. Hier is een oplossing om alle uren, en alle dagen:

    Alle Dagen:

    static public List<string> get_days_between_two_dates(DateTime start_date, DateTime end_date)
        {
            List<string> days_list = new List<string>();
            DateTime temp_start;
            DateTime temp_end;
    
            //--Normalize dates by getting rid of minues since they will get in the way when doing the loop
            temp_start = new DateTime(start_date.Year, start_date.Month, start_date.Day);
            temp_end = new DateTime(end_date.Year, end_date.Month, end_date.Day);
    
            //--Example Should return
            //--1-12-2014 5:59AM - 1-13-2014 6:01AM return 12 and 13
            for (DateTime date = temp_start; date <= temp_end; date = date.AddDays(1))
            {
                days_list.Add(date.ToShortDateString());
            }
    
            return days_list;
        }

    Alle Uren:

    static public List<string> get_hours_between_two_dates(DateTime start_date, DateTime end_date)
        {
            List<string> hours_24_list = new List<string>();
            DateTime temp_start;
            DateTime temp_end;
    
            //--Normalize dates by getting rid of minutes since they will get in the way when doing the loop
            temp_start = new DateTime(start_date.Year, start_date.Month, start_date.Day, start_date.Hour, 0, 0);
            temp_end = new DateTime(end_date.Year, end_date.Month, end_date.Day, end_date.Hour, 0, 0);
    
            //--Example Should return
            //--5:59AM - 6:01AM return 5am and 6am
            for (DateTime date = temp_start; date <= temp_end; date = date.AddHours(1))
            {
                hours_24_list.Add(date.ToShortTimeString());
            }
    
            return hours_24_list;
        }
  8. 0
    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();
    }

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *