【问题标题】:Determining a calendar year (with/without leap-years)确定日历年(有/无闰年)
【发布时间】:2011-07-14 07:39:50
【问题描述】:

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

原问题:

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

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

但是,上面的代码不能处理闰年!在从 2011 年 1 月 1 日到 2014 年 12 月 31 日的测试期间,我们的单元测试标记了 365 次预期日期与确定的结束日期不匹配的事件。定义错误边界的日期是:

  • 开始日期: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)" 快速确定日历年?

【问题讨论】:

  • 使用 DateTime.IsLeapYear 方法怎么样?

标签: c# datetime


【解决方案1】:

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

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

【讨论】:

  • 嗯,你是对的。我们从调查报告的错误开始,并一直在修改我们的测试以尝试将其固定下来。在这个过程中,我们似乎对“测试结果”有点盲目。我会再看一下并相应地更新问题。
【解决方案2】:

我一定遗漏了一些非常明显的东西,就像我输入 2011 年 3 月 1 日一样,然后做 addyear-1day,我得到的结果正如我作为人类所期望的那样 2012 年 2 月 29 日,如果我做 2012 年 2 月 28 日 addyear-1day 我得到2013 年 2 月 27 日 .. 如果您只想添加 365 天,请执行此操作。我有点困惑。所以你的实际目的看起来是正确的。

需要更多咖啡吗?

【讨论】:

  • 看起来确实是这样,我很惊讶扩展方法不起作用,因为我以前使用过它并且很确定它没问题。只是想弄清楚发生了什么,并会相应地更新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多