从c#今天开始查找下一个闰年

时间:2016-07-12 19:29:06

标签: c#

我希望从今天开始寻找下一个闰年。

例如,

Date        NextLeapDate
-----       ------------
2016-01-01   2016-02-29
2016-05-24   2020-02-29
2017-02-03   2020-02-29

这是我到目前为止获得下一个闰年但它给我错误的价值,

public int GetNextLeapYear(int year)
{
    bool isLeapYear = false;

    while (true)
    {
        if (DateTime.IsLeapYear(year))
        {
            isLeapYear = true;
        }
        else
        {
            year = year + 1;
            GetNextLeapYear(year);
        }
        break;
    }
    return year;
}

4 个答案:

答案 0 :(得分:5)

这样的事情:

DateTime GetNextLeapDate (DateTime baseDate)
{
    int year = baseDate.Year;

    // start in the next year if we’re already in March
    if (baseDate.Month > 2)
        year++;

    // find next leap year
    while (!DateTime.IsLeapYear(year))
        year++;

    // get last of February
    return new DateTime(year, 2, 29);
}

请注意,如果(并且仅当)基准日期已经超过3月(即可能的闰日已经结束),我们需要跳过检查当前年份。这样,我们就不会得到2016年2月29日的结果,例如今天(这篇文章的时间)。

像这样使用它返回所需的日期:

Console.WriteLine(GetNextLeapDate(new DateTime(2016, 01, 01))); // 2016-02-29
Console.WriteLine(GetNextLeapDate(new DateTime(2016, 05, 24))); // 2020-02-29
Console.WriteLine(GetNextLeapDate(new DateTime(2017, 02, 03))); // 2020-02-29

答案 1 :(得分:2)

您当前的代码只是该计划的一部分?以下代码是从问题中复制的,并随着我的建议编辑(以及其他简化)进行了更改,以使其正常工作。

public int GetNextLeapYear(int year)
{
    if (DateTime.IsLeapYear(year))
    {
        return year;
    }
    else
    {
        year = year + 1;
        return GetNextLeapYear(year);
    }
}

答案 2 :(得分:2)

你不需要递归。试试这个:

public int GetNextLeapYear(int year)
{
    while (true)
    {
        if (DateTime.IsLeapYear(year))
        {
            return year;
        }
        year = year + 1;
    }
}

答案 3 :(得分:1)

要使用递归查找下一个闰年,您可以更改方法。

public int GetNextLeapYear(int year)
{
    if (!DateTime.IsLeapYear(year))
    {
        return GetNextLeapYear(year + 1);
    }
    return year;
}

使用递归,您不需要While循环,只需要检查是否需要继续或返回值。这也允许您摆脱不需要的变量。 @poke答案更完整,计算你所在的实际月份。我只回答这种方式来保持像你一样使用递归。