如何计算C#中两年间的闰年数

Vla*_*den 13 c# linq datetime date

有没有更好的方法来计算两年之间的闰年数.假设我有开始日期和结束日期.

我有我的代码,但我认为应该有更优雅的方式.

调用代码:

var numberOfLeapYears = NumberOfLeapYears(startDate.Year + 1, endDate.Year - 1);
Run Code Online (Sandbox Code Playgroud)

功能本身:

    private static int NumberOfLeapYears(int startYear, int endYear)
    {
        var counter = 0;

        for (var year = startYear; year <= endYear; year++)
            counter += DateTime.IsLeapYear(year) ? 1 : 0;

        return counter;
    }
Run Code Online (Sandbox Code Playgroud)

所以,如果我有startDate = "10/16/2006",endDate = "4/18/2004"我的结果应该只有1个闰年(2000).另外一个词startDate的年份和endDate的年份不应该计算,只有几年之间.

在此先感谢您的帮助.

Vic*_*din 27

您可以使用分析方法对其进行计数.一年是闰年,如果可以除以4,但不能除以100,除非它可以除以400.假设您可以通过以下代码计算这样的数字:

static int LeapYearsBetween(int start, int end)
{
    System.Diagnostics.Debug.Assert(start < end);
    return LeapYearsBefore(end) - LeapYearsBefore(start + 1);
}

static int LeapYearsBefore(int year)
{
    System.Diagnostics.Debug.Assert(year > 0);
    year--;
    return (year / 4) - (year / 100) + (year / 400);
}
Run Code Online (Sandbox Code Playgroud)

某种数学魔术.它比使用LINQ更有效.

  • 就我个人而言,我会尽可能坚持使用 O(1) 算法而不是 O(n) 算法。 (2认同)
  • 仅供参考:如果使用双打,则最后一个方法与“(year-1)* 0.2425”相同。:) (2认同)

Sae*_*iri 11

您可以使用LINQ执行此操作,如下所示:

var leepYears = Enumerable.Range(startYear, endYear - startYear + 1)
                              .Count(x => DateTime.IsLeapYear(x));
Run Code Online (Sandbox Code Playgroud)

  • @Vlad Bezden LINQ是一个很好的工具,但是对于这个任务,有很多有效的解决方案(参见我的回答).当范围很大时,LINQ解决方案很慢,但我的算法与范围大小无关. (3认同)