将两个日期的差值加到另一个日期上,避免闰年。

3

我的目标是计算两个日期之间的差值,然后将这段时间加上原始开始日期的天数。

DateTime originalStart = new DateTime(2015, 1, 1);
DateTime newDate = originalStart.AddDays((endDate - startDate).TotalDays);

例如,使用以下参数:
原始开始日期:2015年1月1日 开始日期:2016年1月1日 结束日期:2017年1月1日
新日期应为:2016年1月1日(开始和结束之间的差异是1年,因此我们将这一年加到原始开始日期)
我的问题是如果闰年包含在endDate和startDate之间的日期差异中,那么当我添加这些天数到originalStart时,我得到像2016年1月2日这样的日期。
有什么办法可以避免闰年,以确保如果2016年1月1日和2017年1月1日之间的差异被四舍五入,则只需将一年完全添加到originalStart中,而不是由于闰年多加了一天。

1
只需检查年份是否为闰年并采取相应措施。 - Equalsk
2
首先检查起始年份或结束年份是否为闰年。然后检查二月二十九日是否在您的目标时间范围内。如果是,则减去一天。 - Andrei V
“避免闰年”到底是什么意思?如果时间跨越了两个闰年,但是将这段时间加到原始开始时间上只会跨越一个闰年,那么期望的结果是什么? - Tim Schmelter
如果日期是2016年4月1日和2016年5月1日,那么结果应该是1/31/2015(您当前的解决方案),还是因为它们正好相差一个月,实际上应该是2/1/2015? - juharr
1
在这种情况下,您需要处理更多的时间,因为月份和年份都不是标准的时间测量单位。 - juharr
显示剩余2条评论
1个回答

0
   DateTime originalStart = new DateTime(2015, 1, 1);
    DateTime zeroTime = new DateTime(1, 1, 1);
    DateTime endDate = new DateTime(2016, 1,1);
    endDate .Dump();
    DateTime startDate= new DateTime(2017, 1,1);
    startDate.Dump();

    TimeSpan span = startDate- endDate ;

    // because we start at year 1 for the Gregorian 
    // calendar, we must subtract a year here.

    int years = (zeroTime + span).Year - 1;
    int months = (zeroTime + span).Month - 1;
    int days = (zeroTime + span).Day;

    years.Dump();
    months.Dump();
    days.Dump();
originalStart= originalStart.AddMonths(months);
originalStart = originalStart.AddYears(years);
originalStart = originalStart.AddDays(days);

我没有访问.Dump(),那是什么? - Blake Rivell
@BlakeRivell 这很可能是在使用 LinqPad 创建的,它使用 Dump 将对象写入控制台。因此,您可以将它们替换为 Console.WriteLine 调用。 - juharr
我认为你是指 AddYears(years) 而不是 AddYears(days) - juharr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接