我希望从今天开始寻找下一个闰年。
例如,
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;
}
答案 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答案更完整,计算你所在的实际月份。我只回答这种方式来保持像你一样使用递归。