2009-07-29 3 views
16

選択した日付を文字列としてメソッドに渡すカレンダーがあります。このメソッドでは、選択した開始日から終了日までのすべての日付を含む、選択した開始日から終了日までのすべての日付のリストを生成したいとします。2つの日付をループする方法

以下、私はDateTime計算関数を利用できるように、日付文字列をDateTime変数に変換するメソッドの初めを持っています。しかし、開始日と終了日の間のすべての日付を計算する方法を考えることができません。 明らかに、最初の段階は終了日から開始日を差し引くことですが、残りの手順は計算できません。

大いに助かり、

種類について。

public void DTCalculations() 
{ 
List<string> calculatedDates = new List<string>(); 
string startDate = "2009-07-27"; 
string endDate = "2009-07-29"; 

//Convert to DateTime variables 
DateTime start = DateTime.Parse(startDate); 
DateTime end = DateTime.Parse(endDate); 

//Calculate difference between start and end date. 
TimeSpan difference = end.Subtract(start); 

//Generate list of dates beginning at start date and ending at end date. 
//ToDo: 
} 
+0

生成された値(日付、時間、分)のステップを知っていましたか? –

答えて

33
static IEnumerable<DateTime> AllDatesBetween(DateTime start, DateTime end) 
{ 
    for(var day = start.Date; day <= end; day = day.AddDays(1)) 
     yield return day; 
} 

編集ループのためにこれを行うことができます

を10
var calculatedDates = 
    new List<string> 
    (
     AllDatesBetween 
     (
      DateTime.Parse("2009-07-27"), 
      DateTime.Parse("2009-07-29") 
     ).Select(d => d.ToString("yyyy-MM-dd")) 
    ); 
+2

私はいつも利回りのキーワードがほとんどの人々で使用されていないと感じています。 – MPritchard

+1

完全性のために、静的にしてもいいです – MPritchard

+0

いい仕事、それは完璧です –

2

一番簡単な方法は、あなたが終了日に達するまで(AddDaysを使用して)開始日を取り、そしてそれに1日追加となります。このような何か:明らか

DateTime calcDate = start.Date; 
while (calcDate <= end) 
{ 
    calcDate = calcDate.AddDays(1); 
    calculatedDates.Add(calcDate.ToString()); 
} 

、しばらくの間、条件付きとAddDaysの位置を調整しますが、あなたが開始日と終了日コレクション内かどうかを含めたい場合に応じて呼び出します。

[編集:ところで、あなたはうまく日付に変換しない文字列で渡される代わりに場合パース()のTryParse()を使用することを検討すべきである]

+0

終了日が開始日よりも大きいことを確認して、無限ループにならないようにします。 :) –

+1

Greg、あなたは==でチェックするべきではありませんが、<= –

1
for(DateTime i = start; i <= end; i = i.AddDays(1)) 
{ 
    Console.WriteLine(i.ToShortDateString()); 
} 
+0

あなたは変数として 'i'を使ってforループの要点を得ました。それでは大変ありがとうございます。 –

4

あなただけから反復処理する必要がありますあなたの特定の例を解決するためにコードを追加し、使用方法を実証するために:最後に起動し、あなたは

DateTime start = DateTime.Parse(startDate); 
DateTime end = DateTime.Parse(endDate); 

for(DateTime counter = start; counter <= end; counter = counter.AddDays(1)) 
{ 
    calculatedDates.Add(counter); 
} 
0

次の操作を行うことができ、呼び出し元のコードに別の方法今

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

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

このアプローチのもう一つの利点は、それはそれは些細なEachWeek、EachMonthなどを追加することができますということですこれらはすべてDateTimeでアクセス可能になります。

関連する問題