首页 文章

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

提问于
浏览
0

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

Original Question:

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

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

However, the code above does not cope with leap years !我们的单元测试标记了365次出现,其中预期日期日期与从2011年1月1日至2014年12月31日开始日期测试的确定结束日期不匹配 . 定义错误边界的日期为:

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

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

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

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

2 回答

  • 4

    它看起来像"actual"版本是正确的...为什么你期望从2月28日"one year minus a day"到2月26日?如果2月27日不包含在任何地方,你怎么能说它包含一个历年?

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

  • 0

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

    需要更多咖啡吗?

相关问题