2017-09-15 19 views
-3

次の方法を使用して、指定された2つの日付間に日付シーケンスを作成します。例えば、指定した日付である場合には、1ヶ月インクリメントしながら、日付のシーケンスを作成与えられた2つの日付間の日付シーケンスの作成 - 2月2日に失敗する

public List<DateTime> dateSeq(DateTime startDate, DateTime endDate) 
{ 
    List<DateTime> allDates = new List<DateTime>(); 

    for (DateTime date = startDate; date <= endDate; date = date.AddMonths(1)) 
     allDates.Add(date); 

    return allDates; 
} 

startDate: 2017-01-01 
endDate: 2017-05-01 

私が手シーケンスは大丈夫です:

2017-01-01 
2017-02-01 
2017-03-01 
2017-04-01 
2017-05-01 

しかし、与えられた日付以下のとおりです。

startDate: 2017-01-31 
endDate: 2017-05-31 

は私が渡して2月は28日目ヶ月シーケンスの残りの部分を設定するときに失敗取得シーケンス:つまり、なぜ

2017-01-31 
2017-02-28 
2017-03-28 
2017-04-28 
2017-05-28 

誰かが説明していただけますか?

+0

を維持アプローチを探していると思いますその日までの1ヶ月は行進の28日となります。何が理解できないのか分かりません。このような機能を持たせたい場合は、終わりではなく、毎月の開始点を使用します。したがって、月と年に応じて変化する毎月の日数(閏年/非閏年)を処理する必要はありません28,29,30および31)。 – Igor

+0

startdateが '2017-02-28'の場合、どのように動作するのでしょうか? – fubo

答えて

2

2017-02-31が存在しないため、2017-02-28.AddMonth(1)という結果が2017-03-28になるため、正しいです。

非うるう年の2月の月の最後の日の追加28ですので、私はあなたが最初の開始日

public IEnumerable<DateTime> dateSeq(DateTime startDate, DateTime endDate) 
{ 
    int temp = 0; 
    while (startDate.AddMonths(temp) <= endDate) 
     yield return startDate.AddMonths(temp++); 
} 

https://dotnetfiddle.net/Mz7yFh

+0

'startDate'が' 2017-02-28'で、 'endDate'が' 2017-05-30'だったとしてもそれはまだうまくいかないでしょう。日付を無視する日付(すなわち、月の初めに始まる日付)を使用するか、変数の日付をチェックしている月の最後の日付に設定するロジックを充実させる必要があります。 – Igor

+0

@Igor質問は月の最後の日ではない - OPはまた '2017-01-01'の例を述べた – fubo

関連する問題