2010-07-29 3 views
44

Ich habe eine DateTime StartDate und EndDate.Iterate über jeden Tag zwischen StartDate und EndDate

Wie kann ich unabhängig von den Zeiten über jeden Tag zwischen diesen beiden iterieren?

Beispiel: Startdatum ist 2010.07.20 17.10.32 und EndDate ist 2010.07.29 01.59.12.

Ich möchte in der Lage sein, über 7/20, 7/21, 7/22 .. 7/29 zu iterieren.

+0

Werfen Sie einen Blick hier: http://StackOverflow.com/Questions/533767/how-do-you-iterate-through-every-day-of-the-year –

Antwort

112
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) 
{ 
    ... 
} 

Das .Date ist, um sicherzustellen, dass Sie den letzten Tag haben, wie im Beispiel.

+0

Ich denke, dass Sie wollen, date.Date <= EndDate.Date, so dass Sie bekommen der letzte Tag. –

+2

Dies geht in eine Endlosschleife, die AddDays-Methode ändert das Datum nicht, sondern gibt eine neue DateTime-Instanz zurück. Verwenden Sie stattdessen date = date.AddDays (1). – corvuscorax

+0

@Dean: Danke, habe deinen Kommentar nach der Änderung gesehen. –

0
DateTime date = DateTime.Now; 
DateTime endDate = date.AddDays(10); 

while (date < endDate) 
{ 
    Console.WriteLine(date); 
    date = date.AddDays(1); 
} 
3

Sie müssen vorsichtig sein über Enddatum. Zum Beispiel in

Beispiel: StartDate ist 7/20/2010 5:10:32 PM und EndDate ist 7/29/2010 1:59:12 AM.
Ich möchte in der Lage sein, über 7/20, 7/21, 7/22 .. 7/29 zu iterieren.

date < endDate wird nicht 7/29 jemals enthalten. Wenn Sie einen Tag zu 7/28 5:10 hinzufügen - es wird 7/29 5:10 PM, die höher als 7/29 2 AM ist.

Wenn das nicht das, was Sie wollen, dann würde ich sagen, Sie tun

for (DateTime date = start.Date; date <= end.Date; date += TimeSpan.FromDays(1)) 
{ 
    Console.WriteLine(date.ToString()); 
} 

oder etwas in diesem Sinne.

11

Eine alternative Methode, die möglicherweise wiederverwendbar ist, besteht darin, eine Erweiterungsmethode für DateTime zu schreiben und ein IEnumerable zurückzugeben.

Zum Beispiel können Sie eine Klasse definieren:

public static class MyExtensions 
{ 
    public static IEnumerable EachDay(this DateTime start, DateTime end) 
    { 
     // Remove time info from start date (we only care about day). 
     DateTime currentDay = new DateTime(start.Year, start.Month, start.Day); 
     while (currentDay <= end) 
     { 
      yield return currentDay; 
      currentDay = currentDay.AddDays(1); 
     } 
    } 
} 

Jetzt im rufenden Code können Sie Folgendes tun:

DateTime start = DateTime.Now; 
DateTime end = start.AddDays(20); 
foreach (var day in start.EachDay(end)) 
{ 
    ... 
} 

Ein weiterer Vorteil dieses Ansatzes besteht darin, dass sie es trivial macht Fügen Sie EachWeek, EachMonth usw. hinzu. Diese sind dann alle auf DateTime verfügbar.

+1

Sie können Zeitinformationen aus dem Datum mit DateTime.Date entfernen: https://msdn.microsoft.com/en-us/library/system.datetime.date(v=vs.110).aspx – Oswin

+1

warum nicht mach es typsicher? IEnumerable ? – duedl0r

0

Die Schleifen von @Yuriy Faktorowitsch, @healsjnr und @mho werden alle eine System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime Ausnahme, wenn EndDate == DateTime.MaxValue werfen. dies zu verhindern, wird eine zusätzliche Überprüfung am Ende der

Schleife hinzufügen
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) 
{ 
    ... 
    if (date.Date == DateTime.MaxValue.Date) 
    { 
     break; 
    } 
} 

(ich dies @Yuriy Faktorowitsch Antwort als Kommentar geschrieben haben würde, aber ich fehle Ruf)

Verwandte Themen