【问题标题】:How do I factor in leap years when determining the difference between two dates using Javascript?在使用 Javascript 确定两个日期之间的差异时,如何考虑闰年?
【发布时间】:2021-02-02 17:04:59
【问题描述】:

我正在尝试设置一个计数器来确定设置的过去日期和当前日期之间的差异。

我设法设置了一个计数器来确定两点之间的秒数,使用以下代码将结果分成年、日、小时、分钟、秒:

var lastDay = new Date("Jan 1, 1994  00:00:01").getTime(); 
var x = setInterval(function() { 
var now = new Date().getTime(); 
var t = now - lastDay; 
var years = Math.floor(t / (1000 * 60 * 60 * 24)/ 365);
var days = Math.floor((t % (1000 * 60 * 60 * 24 * 365))/(1000 * 60 * 60 * 24)); 
var hours = Math.floor((t % (1000 * 60 * 60 * 24))/(1000 * 60 * 60)); 
var minutes = Math.floor((t % (1000 * 60 * 60)) / (1000 * 60)); 
var seconds = Math.floor((t % (1000 * 60)) / 1000); 
document.getElementById("year").innerHTML =years ; 
document.getElementById("day").innerHTML =days ; 
document.getElementById("hour").innerHTML =hours; 
document.getElementById("minute").innerHTML = minutes;  
document.getElementById("second").innerHTML =seconds;  
if (t < 0) { 
        clearInterval(x); 
        document.getElementById("demo").innerHTML = "TIME UP"; 
        document.getElementById("year").innerHTML ='0'; 
        document.getElementById("day").innerHTML ='0'; 
        document.getElementById("hour").innerHTML ='0'; 
        document.getElementById("minute").innerHTML ='0' ;  
        document.getElementById("second").innerHTML = '0'; } 
}, 1000);

我遇到的问题是它没有考虑闰年,因此“天”数字不准确。它应该再增加 7 天,以说明设定日期和当前日期(撰写本文时)之间的闰年数。

我尝试使用下面的代码来计算闰年:

var countLeapYears = function(){
  var yearNow = new Date().getFullYear(); 
    var then = new Date("Jan 1, 1994 00:00:01");
    var yearThen = then.getFullYear();
    var beginYear = 0;
    var endYear = 0;
    var leapYearCount = 0;

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

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

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

    return leapYearCount;
}

然后我尝试将 'leapYearCount' 添加到 'days' 但失败了:

var countLeapYears = function(){
  var yearNow = new Date().getFullYear(); 
    var then = new Date("Jan 1, 1994 00:00:01");
    var yearThen = then.getFullYear();
    var beginYear = 0;
    var endYear = 0;
    var leapYearCount = 0;

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

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

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

    return leapYearCount;
}

var lastDay = new Date("Jan 1, 1994 00:00:01").getTime(); 
var x = setInterval(function() { 
var now = new Date().getTime(); 
var t = now - lastDay; 
var years = Math.floor(t / (1000 * 60 * 60 * 24)/ 365);
var days = Math.floor((t % (1000 * 60 * 60 * 24 * 365))/(1000 * 60 * 60 * 24) + leapYearCount); 
var hours = Math.floor((t % (1000 * 60 * 60 * 24))/(1000 * 60 * 60)); 
var minutes = Math.floor((t % (1000 * 60 * 60)) / (1000 * 60)); 
var seconds = Math.floor((t % (1000 * 60)) / 1000); 
document.getElementById("year").innerHTML =years ; 
document.getElementById("day").innerHTML =days ; 
document.getElementById("hour").innerHTML =hours; 
document.getElementById("minute").innerHTML = minutes;  
document.getElementById("second").innerHTML =seconds;  
if (t < 0) { 
        clearInterval(x); 
        document.getElementById("demo").innerHTML = "TIME UP"; 
        document.getElementById("year").innerHTML ='0'; 
        document.getElementById("day").innerHTML ='0'; 
        document.getElementById("hour").innerHTML ='0'; 
        document.getElementById("minute").innerHTML ='0' ;  
        document.getElementById("second").innerHTML = '0'; } 
}, 1000);

有什么想法可以纠正这个问题并添加额外的天数来说明已经过去的闰年数吗?

非常感谢。

【问题讨论】:

  • 很多问题,但没有一个专门解决这个问题。因此,用更多细节和一些示例代码提出问题。我只需要检查我有什么。链接问题中的答案也不起作用。还是谢谢。
  • 如果您的具体问题是“如何确定两个日期之间的闰年数”,那是与问题标题和开场白不同的问题。算法floor(years ÷ 4) + 1) 在很多情况下都不能正常工作,例如1996 年 3 月 1 日至 2004 年 2 月 28 日包含 1 个闰日,但算法返回 3。
  • 阅读整篇文章。问题很明确

标签: javascript date leap-year


【解决方案1】:

答案比我之前想象的要简单得多。

由于我只是想考虑闰年的天数差异,我只需要将年数除以 4 并加 1,如下所示:

var lastDay = new Date("Jan 1, 1994 10:00:00").getTime(); 
var x = setInterval(function() { 
var now = new Date().getTime(); 
var t = now - lastDay; 
var years = Math.floor(t / (1000 * 60 * 60 * 24)/ 365);
var leapDays = Math.floor((years / 4) + 1);
var days = Math.floor((t % (1000 * 60 * 60 * 24 * 365))/(1000 * 60 * 60 * 24) - leapDays); 
var hours = Math.floor((t % (1000 * 60 * 60 * 24))/(1000 * 60 * 60)); 
var minutes = Math.floor((t % (1000 * 60 * 60)) / (1000 * 60)); 
var seconds = Math.floor((t % (1000 * 60)) / 1000); 
document.getElementById("year").innerHTML =years ; 
document.getElementById("day").innerHTML =days ; 
document.getElementById("hour").innerHTML =hours; 
document.getElementById("minute").innerHTML = minutes;  
document.getElementById("second").innerHTML =seconds;  
if (t < 0) { 
        clearInterval(x); 
        document.getElementById("demo").innerHTML = "TIME UP"; 
        document.getElementById("year").innerHTML ='0'; 
        document.getElementById("day").innerHTML ='0'; 
        document.getElementById("hour").innerHTML ='0'; 
        document.getElementById("minute").innerHTML ='0' ;  
        document.getElementById("second").innerHTML = '0'; } 
}, 1000);

【讨论】:

  • 以上只是在 Safari 中抛出错误。闰年的算法有问题。在 1896 年 3 月 1 日至 1904 年 2 月 28 日期间,当该期间闰年为零时,它会额外返回 2 天。 (Math.floor((new Date(1904,1,28)-new Date(1896,2,1))/8.64e7/365)/4|0)+1。同样,1996 年 3 月 1 日至 2004 年 2 月 28 日期间包含 1 个闰年,但算法返回 3。
  • 我在 safari 和 chrome 上都运行它,没有任何问题。我尝试过的每个日期变化的答案都是正确的。
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2015-07-24
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多