有没有更好的方法来计算两年之间的闰年数。假设我有开始日期和结束日期。
我有我的代码,但我认为应该有更优雅的方式。
调用代码:
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的年份不应该计算,只有几年之间。
提前感谢您的帮助。
答案 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次,然后它就是简单的数学运算。