javascript - 在使用 Javascript 确定两个日期之间的差异时,如何考虑闰年?
问题描述
我正在尝试设置一个计数器来确定设置的过去日期和当前日期之间的差异。
我设法设置了一个计数器来确定两点之间的秒数,使用以下代码将结果分成年、日、小时、分钟、秒:
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);
有什么想法可以纠正这个问题并添加额外的天数来说明已经过去的闰年数吗?
非常感谢。
解决方案
答案比我之前想象的要简单得多。
由于我只是想考虑闰年的天数差异,我只需要将年数除以 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);
推荐阅读
- sql-server - 执行查询时,在 SQL 服务器中显示错误
- javascript - 基于React中的唯一键禁用按钮?
- java - 使用 DefaultHttpClient 尝试 POST 请求时连接重置
- excel - 如何从一系列代码中移出,在另一个模块中执行不同的 on,然后退回
- c++ - 使用 C++ 在 ffmpeg 中解码 NAL 单元
- javascript - 我正在制作一个网站,您需要在其中输入四位密码才能进入下一页
- c# - 用户控件中未调用覆盖事件
- java - 如何在 Antlr 中使用访问者创建自定义 AST
- r - 如何将数据框的一部分转换为两个箱形图以进行比较?
- vbscript - 如何单击 Web 表中可用的链接?