使用条件语句和 while 循环 JavaScript 计算 2 个日期之间的闰年

问题描述 投票:0回答:2

我有一个更大的函数,用于计算输入的年、月、日与 JavaScript 中的现在之间的时间间隔。在我的函数的这一部分中,我正在测试哪一年更大(因为它的设计方式,它可以从过去或将来获取日期,并可以计算时间间隔)...一开始,我计算了 UTC 时间间隔,然后将其转换为天,最终我必须再次返回以年、月和日为单位的时间间隔,以便再次转换时间间隔。 在本节中,我试图准确计算时间跨度内发生了多少个闰年,但由于输入日期可能是未来或过去,所以我设置了条件语句来查看哪个日期更大,因此我可以迭代时间跨度。无论如何,我在创建这个函数(这只是我的较大函数的一小部分)来测试闰年并添加到闰年计数(我希望返回它,以便我可以准确地转换天数间隔)时遇到很多问题到年、月和日)。我觉得我的所有这些条件语句的语法有点偏离(我真的几个月前才开始用 JavaScript 编程)并且我不知道如何在之前的闰年算法测试中分配变量“year”测试,这样我就可以测试它,因为我希望年份是 2 年之间的所有年份(yearNow 和yearThen)...无论如何,任何帮助将不胜感激:

var leapYear = function (inputYear, inputMonth, inputDay) {
  var now = new Date();
  var yearNow= now.getFullYear();
  var then = new Date(inputYear, (inputMonth-1), inputDay);
  var yearThen = then.getFullYear;
  var leapYearCount = 0;
  var beginYear = 0;
  if (yearNow < yearThen)
  beginYear = yearNow;
  while (beginYear < yearThen) {
  if ((year & 3) === 0 && ((year % 25) !== 0 || (year & 15) === 0))
    leapYearCount += 1;
    beginYear++;
  }
  if (yearThen < yearNow)
  beginYear = yearThen;
  while (beginYear < yearNow) {
  if ((year & 3) === 0 && ((year % 25) !== 0 || (year & 15) === 0))
    leapYearCount += 1;
    beginYear++;
  }
  return leapYearCount;
};

编辑** 我尝试将此处的“年份”设置为“beginYear”,但最终在 2005 年和现在之间得到了 489 个闰年,这绝对是不正确的 - 我觉得我可能在这个函数中做了其他错误的事情,除了没有指定“年份”,但我不确定是什么......任何帮助将不胜感激。

javascript date while-loop conditional-statements
2个回答
1
投票

这将计算您的闰年,请记住,如果是闰年,它也会将当前年份算作闰年,如果是闰年,它也会将起始年份算作闰年。

var countLeapYears = function(y,m,d){
    var yearNow = new Date().getFullYear(),
        yearThen = y,
        beginYear = 0,
        endYear = 0,
        leapYearCount = 0;

    var isLeapYear = function(year){
      return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }

    if(yearNow < y){
       beginYear = yearNow;
       endYear = y;
    }else if(yearNow > y){
       beginYear = y;
       endYear = yearNow;
    }else if(yearNow == y){
       beginYear = y;
       endYear = y;
    }

    for(i = beginYear; i <= endYear; i++){
      if(isLeapYear(i)){
        leapYearCount++;
      }
    }

    return leapYearCount;
}

console.log(countLeapYears(2005,10,12)); // 3
console.log(countLeapYears(2020,10,12)); // 2
console.log(countLeapYears(2016,10,12)); // 1

0
投票

计算 2 年之间闰年数量的更短、更快的方法可以通过首先将年份与 4(向上和向下)的边界对齐,然后循环 4 并检查是否是闰年来实现,但无需检查

year MOD 4
并且仅检查
year MOD 100 and 400

对于大量年份范围,这可以更快地得出结果。

这是一个带有测试示例的简短函数。

function countLeapYears(yStart, yEnd) {
yEnd   = Math.floor(yEnd/4)*4;
yStart = Math.ceil(yStart/4)*4;
let leaps=0;
while (yStart <= yEnd) {
    (yStart % 100 || !(yStart % 400)) && leaps++;
    yStart +=4;
}
return leaps;
}


//========= tests ==================

console.log(countLeapYears(1,1));       // 0
console.log(countLeapYears(4,4));       // 1
console.log(countLeapYears(2023,2023)); // 0
console.log(countLeapYears(1,2024));    // 491
console.log(countLeapYears(1,30000));   // 7275
console.log(countLeapYears(1,300000));  // 72750
console.log(countLeapYears(2005,2024)); // 5
console.log(countLeapYears(2020,2024)); // 2
console.log(countLeapYears(2016,2024)); // 3
console.log(countLeapYears(2024,2024)); // 1

© www.soinside.com 2019 - 2024. All rights reserved.