确定日历年(有/没有闰年)

时间:2011-07-14 07:39:50

标签: c# datetime

更新:故事的寓意是相信一种直觉,而不是去寻找问题。最后,用户报告的问题处于完全不同的区域,Jon强调我们在测试中引入了一个错误,我们错过了这个错误,因为结果似乎验证了要查找的内容。

原始问题:

在许多应用程序中,需要显示开始/结束日期,其中结束日期包含一个日历年。因此,如果开始日期是2012年1月1日,则结束日期是2012年12月31日。基本规则是添加一年,休息一天 - 作为您的扩展方法:

    public static DateTime CalendarYear(this DateTime dateTime)
    {
        return dateTime.AddYears(1).AddDays(-1);
    }

但是,上面的代码无法应对闰年!我们的单元测试标记了365次出现,其中预期日期日期与从2011年1月1日至2014年12月31日开始日期测试的确定结束日期不匹配。定义错误边界的日期为:

  • 开始日期:2011年3月1日,预计结束日期:2012年2月28日:实际结束 日期:2012年2月29日
  • 开始日期:2012年2月28日,预计结束日期:2月26日 2013年:实际结束日期:2013年2月27日

2011年3月1日之前的日期表现与预期一致,2012年2月28日之后的日期与预期一致。

我知道测试失败的原因是因为开始/结束日期包含2月29日的闰年事件,但有没有人有一个简单,可靠的建议(应对闰年事件)来取代基本的“ AddYears(1).AddDays(-1)“以快速确定日历年?

2 个答案:

答案 0 :(得分:4)

在我看来,“实际”版本是正确的......为什么你从2月28日到2月26日期待“一年减去一天”?如果2月27日不包含在任何地方,你怎么能说它包含一个日历年?

如果确实想要这些值,您是否考虑过只调用AddDays(364)

答案 1 :(得分:0)

我必须错过一些非常明显的东西,好像我放在2011年3月1日,并且做了一年一天,我像人类一样期待2012年2月29日,如果我做了2012年2月28日,那么我得到了2013年2月27日..如果您只想添加365天,那么就这样做。我有点困惑。所以你的实际目标看起来是正确的。

需要更多咖啡吗?