While循环中的DateTime.AddDays。我错过了什么?

时间:2012-01-21 21:10:16

标签: c#

我有一个日期时间对象dt,它保存了今天的日期。

DateTime dt = DateTime.Today;
DateTime idt = new DateTime();

我需要打印循环到达当前年度最后一天的日期,如下所示:
 345 more days to 12/31/2012

如果我这样做的话

while (dt.AddDays(i).Year == dt.Year) 
{
    idt = dt.AddDays(i);
    i++;
}
Console.WriteLine("{0} more days to {1}", i, idt.ToString("d")); 

我可以按照我的要求进行打印:345 more days to 1/1/2012

我想避免在上面的部分重复dt.AddDays(i)。如果我这样做:

while (idt.Year != dt.Year + 1)
{
    idt = dt.AddDays(i);
    i++;
}
Console.WriteLine("{0} more days to {1}", i, idt.ToString("d"));

或者这样:

while (idt.Year < 2013)
{
    idt = dt.AddDays(i);
    i++;
} 
Console.WriteLine("{0} more days to {1}", i, idt.ToString("d"));

我得到的输出为346 more days to 1/1/2013

我肯定错过了一些非常明显的东西,但我无法弄明白。会是什么?

4 个答案:

答案 0 :(得分:6)

您可以使用TimeSpan来计算差异:

var nextYear = new DateTime(DateTime.UtcNow.Year, 31, 12);
var timeToNextYear = nextYear - DateTime.UtcNow.Date;
var daysToNextYear = timeToNextYear.TotalDays;

答案 1 :(得分:4)

为什么不

int days = new DateTime(dt.Year, 12, 31).Subtract(dt).Days;

答案 2 :(得分:1)

在这两种情况下,while循环中的条件在2012年12月31日评估为true,然后在循环内再添加一天,将idt设置为1/1/2013。

您可以像这样简单地获取一年中的剩余天数:

int days = (new DateTime(dt.Year, 12, 31) - dt).TotalDays;

答案 3 :(得分:1)

请注意,在此代码中

while (idt.Year < 2013)
{
    idt = dt.AddDays(i);
    i++;
} 

idt.year在循环的前两次迭代中具有相同的值,因为您将递增0。

将其更改为:

while (idt.Year < 2013)
{
    i++;
    idt = dt.AddDays(i);
} 

你会得到正确的结果。

顺便说一句,你可以做一个单行:

int days = (DateTime.Parse("1/1/" + ((DateTime.Now.Year) + 1).ToString()) - DateTime.Now).Days;

如果您的代码需要在各种语言环境中工作,那么您需要使用提供IFormatProvider的DateTime.Parse重载,以便1/1 / yyyy始终解析。