2017-09-15 66 views
-3

使用以下方法在兩個給定日期之間創建日期序列;在兩個給定日期之間創建日期序列 - 二月份失敗

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

創建日期序列,同時增加1個月,例如當給定的日期是:

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 

序列我碰到失敗傳遞二月設置在第28天的月份順序的其餘部分時:

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

能有人請解釋這是爲什麼?

+0

一個方法,因爲最後一天在非閏年二月份是28加那個月的1個月將是3月28日,依此類推。不知道什麼是不明白的。如果你想有這樣的功能,可以使用每個月的開始,而不是結束,所以你不必處理每個月和幾年不同的天數(閏年/非閏年)( 28,29,30和31)。 – Igor

+0

如果startdate爲「2017-02-28」,預期行爲如何? – fubo

回答

2

因爲2017-02-31不存在而2017-02-28.AddMonth(1)結果爲2017-03-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',那還是不行。您必須使用忽略日期的任一日期(例如,從本月1日開始)或者豐富邏輯以將變量日期設置爲被檢查月份的最後日期。 – Igor

+0

@Igor這個問題不是關於這個月的最後一天--OP還提到了'2017-01-01'的例子 – fubo

相關問題