如何计算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是闰年