簡體   English   中英

在C#中從今天開始查找下一個leap年

[英]Find next leap year from today's date in c#

我想找到從今天起的下一個leap年。

例如

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

到目前為止,這是我獲得下一個leap年的能力,但是卻給我帶來了錯誤的價值,

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

像這樣:

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月(即可能的leap日已經結束),我們需要跳過檢查當前年份。 那樣的話,我們不會在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

您當前的代碼只是程序的一部分? 下面的代碼是從問題中復制的,並通過我的建議編輯(以及其他簡化方法)進行了更改,以使其正常工作。

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

您不需要遞歸。 嘗試這個:

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

要使用遞歸來查找下一個leap年,您可以像這樣更改方法。

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

使用遞歸,您不需要While循環,只需要檢查是否需要繼續或返回值即可。 這也使您可以擺脫不需要的變量。 @poke答案會更完整地計算您所處的實際月份等。 我只回答了這種方法,以像您一樣繼續使用遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM