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

时间:2011-01-03 19:16:11

标签: c# linq datetime date

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

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

调用代码:

var numberOfLeapYears = NumberOfLeapYears(startDate.Year + 1, endDate.Year - 1);

功能本身:

    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;
    }

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

提前感谢您的帮助。

7 个答案:

答案 0 :(得分:26)

您可以使用分析方法来计算它。一年是闰年,如果可以除以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);
}

某种数学魔法。这比使用LINQ更有效。

答案 1 :(得分:11)

您可以使用LINQ完成此操作:

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

答案 2 :(得分:3)

对于大片时间而言,这应该会更好:

public int LeapYearsBetween(int year1, int year2)
{
    var y1 = new DateTime(year1, 1, 1);
    var y2 = new DateTime(year2, 1, 1);
    var nonLeapDays = 365 * (y2.Year - y1.Year);
    var leapDays = (y2 - y1).Days - nonLeapDays;
    return leapDays;
}

请注意,如果它是闰年,则计算较早的年份,但不计算较晚的年份。如果您需要不同的行为,则需要修改该功能。

答案 3 :(得分:2)

另一个Linq: - )

int start = 1980;
int end = 2000;
var count = Enumerable.Range(start, end - start + 1)
                      .Aggregate(0, (a, b) => DateTime.IsLeapYear(b) ? a + 1 : a);

答案 4 :(得分:2)

只是另一个带有基元类型的代码

    public static int CountLeapYears(int startYear, int endYear) 
    {
        int acc = 0;

        while (true)
        {
            if ((startYear % 4 == 0 && startYear % 100 != 0) || startYear % 400 == 0)
                acc++;
            if (startYear + 1 == endYear) break;
            startYear++;
        }

        return acc;
    }

答案 5 :(得分:0)

关于你的数学(除非它们也被400整除,否则除以100不是闰年)这意味着1900不是闰年?错

这意味着以下是正确的: 难道你不能只测试前4年并找到第一个闰年并从总年和模型4中减去它吗? 基本上:end_year - first_leap_year_found mod 4 = 0是闰年

答案 6 :(得分:-1)

难道你不能只测试前4年并找到第一个闰年并从总年和模型4中减去它吗?

基本上是:

end_year - first_leap_year_found mod 4.

如果在那里进行一些调整以解释指定整个日期的事实,而不仅仅是年份,我不会感到惊讶,但这些改动也应该很简单。

你最终只需要使用DateTime.IsLeapYear(year)语句最多4次,然后它就是简单的数学运算。