使用DateTime作为循环索引时,操作DateTime值不能按预期工作

时间:2011-03-23 12:53:08

标签: c# datetime for-loop

我需要生成一个日期范围列表,以便输出最终为:

0  – 28/02/2009 to 31/02/2010
1  – 31/03/2009 to 31/03/2010
2  – 30/04/2009 to 30/04/2010
3  – 31/05/2009 to 31/05/2010
4  – 30/06/2009 to 30/06/2010
5  – 31/07/2009 to 31/07/2010
6  – 31/08/2009 to 31/08/2010
7  – 30/09/2009 to 30/09/2010
8  – 31/10/2009 to 31/10/2010
9  – 30/11/2009 to 30/11/2010
10 – 31/12/2009 to 31/12/2010
11 – 31/01/2010 to 31/01/2011
12 – 28/02/2010 to 28/02/2011

所以我创建了一个for循环,以latestDate开头 - 1年作为第一个元素的结束日期,结束日期的开始日期 - 1年,然后通过以下方式增加循环索引:每次迭代1个月,如下:

DateTime latestDate = new DateTime(2011, 2, 28);
int noOfYears = 1; // could vary
int shift = 1; // could vary

Dictionary<DateTime, DateTime> dateRanges = new Dictionary<DateTime, DateTime>();
for (var currentDate = latestDate.AddYears(noOfYears *= -1); 
    currentDate <= latestDate; currentDate.AddMonths(shift))
{
    dateRanges.Add(currentDate.AddYears(noOfYears *= -1), currentDate);
}

我认为这会很糟糕,但由于某种原因我不理解currentDate.AddYears(noOfYears *= -1)似乎没有用,因为字典中的第一个条目是:

28/02/2011 , 28/02/2010 // the first date here should be minus 2 years!?

我期望的地方

28/02/2009 , 28/02/2010 // the first in the list above

当循环第二次迭代时,字典的第二个条目是:

28/02/2009 , 28/02/2010 // this should be first in the dictionary!

我的逻辑是否存在明显错误,我没有看到?

2 个答案:

答案 0 :(得分:1)

您不断将noOfYears变量乘以-1,因此它会在-1和1之间切换。请尝试使用noOfYears * -1代替(不使用等号)。

答案 1 :(得分:1)

currentDate.AddYears(noOfYears *= -1)

会将noOfYears的值从1到-1翻转到-1,再转换为-1,... 我不确定你为什么需要这样做。

此外,您不会更改currentDate的值。试试这个:

// note the new start date
DateTime latestDate = new DateTime(2011, 3, 1); 
// could vary
int noOfYears = 1;     
// could vary
int shift = 1;     

var dateRanges = new Dictionary<DateTime, DateTime>();
for (var currentDate = latestDate.AddYears(noOfYears * -1); 
    currentDate <= latestDate; currentDate = currentDate.AddMonths(shift))
{
    dateRanges.Add(currentDate.AddYears(noOfYears *= -1).AddDays(-1), 
        currentDate.AddDays(-1));
}