如何计算C#中两年间的闰年数
有没有更好的方法来计算两年之间的闰年数。 假设我有开始日期和结束日期。
我有我的代码,但我认为应该有更优雅的方式。
调用代码:
var numberOfLeapYears = NumberOfLeapYears(startDate.Year + 1, endDate.Year - 1);
function本身:
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的年份和endDate的年份不应该计算,只有几年之间。
在此先感谢您的帮助。
您可以使用分析方法对其进行计数。 一年是闰年,如果可以除以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更有效。
你可以使用LINQ完成它,如下所示:
var leepYears = Enumerable.Range(startYear, endYear - startYear + 1) .Count(x => DateTime.IsLeapYear(x));
对于大量的时间,这应该会更好:
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; }
请注意,如果它是闰年,则计算较早的年份,而不是较晚的年份。 如果您需要不同的行为,则需要修改该function。
另一个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);
只是另一个具有基元类型的代码
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; }
难道你不能只测试前4年并找到第一个闰年并从总年份和mod 4中减去它吗?
基本上:
end_year – first_leap_year_found mod 4。
如果在那里进行一些调整以解释指定整个日期的事实,而不仅仅是年份,我不会感到惊讶,但这些改动也应该是简单的。
你最终只需要使用DateTime.IsLeapYear(year)语句最多4次,然后它就是简单的数学运算。
在你的数学上(除非它们也可以被400整除,否则除以100不是闰年)这意味着1900不是闰年? 错误
这意味着以下是正确的:你能不能只测试前4年并找到第一个闰年并从总年和模4中减去它? 基本上:end_year – first_leap_year_found mod 4 = 0是闰年