2017-09-15 88 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

相关问题