使用 setinterval 实时减去日期的问题
Problem with subtracting dates in real time with use setinterval
在这个脚本中,我使用了一些函数和 xDate 库来创建真正格式的日期。我正在尝试制作一个小脚本,实时显示两个日期与时间之间的差异,但我没有在代码中看到不允许这样做的错误。哪里出错了?
jQuery(window).on("load", function() {
function parseISOLocal(s) {
// Split string into its parts
var b = s.split(/\D/);
// Create and return a date object
return new Date(b[0], b[1] - 1, b[2], b[3], b[4], b[5]);
}
// Convert a millisecond value to days, hours, minutes and seconds
function formatDHMS(ms) {
// Helper to add 's' to a number if other than 1
function addS(n) {
return n == 1 ? '' : 's';
}
var d = ms / 8.64e7 | 0;
var h = (ms % 8.64e7) / 3.6e6 | 0;
var m = (ms % 3.6e6) / 6e4 | 0;
var s = (ms % 6e4) / 1e3 | 0;
dd = (d != 0) ? d + ' day' + addS(d) + ', ' : "";
hh = (h != 0) ? h + ' hours' + addS(h) + ', ' : "";
mm = (m != 0) ? m + ' minute' + addS(m) + ', ' : "";
ss = (s != 0) ? s + ' second' + addS(s) + ' ' : "";
return ((d + h + m + s) > 0) ? dd + hh + mm + ss : "Time is over";
}
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
var date = new Date("2020-05-01 12:24:23");
var d1 = new XDate(date.addDays(2));
future_time = d1.toString("yyyy-MM-dd HH:mm:ss");
var d = new XDate();
current_time = d.toString("yyyy-MM-dd HH:mm:ss");
var someDate = new Date();
someDate.setDate(someDate.getDate() + 15); //number of days to add, e.x. 15 days
var dateFormated = someDate.toISOString().substr(0, 10);
console.log(dateFormated);
function Repeat() {
setInterval(function() {
current_time = d.toString("yyyy-MM-dd HH:mm:ss");
$('#timeForSign').html(formatDHMS(parseISOLocal(future_time) - parseISOLocal(current_time)));
}, 100);
}
setTimeout(Repeat, 500);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="http://www.outsourcer.info/xdate.js"></script>
<div id="timeForSign"></div>
问题是因为您只比较区间内的 d
值,而该值永远不会改变。要解决此问题,您只需将 d
更改为 new Date()
,或 new XDate()
,如果您更愿意使用该库:
current_time = new XDate().toString("yyyy-MM-dd HH:mm:ss");
此外,您的 JS 中还有很多不需要的变量,可以删除。试试这个:
jQuery(window).on("load", function() {
let future_time = parseISOLocal(new XDate(new Date("2020-05-01 12:24:23").addDays(2)).toString("yyyy-MM-dd HH:mm:ss"));
function Repeat() {
setInterval(function() {
let current_time = new XDate().toString("yyyy-MM-dd HH:mm:ss");
$('#timeForSign').html(formatDHMS(future_time - parseISOLocal(current_time)));
}, 100);
}
setTimeout(Repeat, 500);
});
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
function parseISOLocal(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1] - 1, b[2], b[3], b[4], b[5]);
}
function formatDHMS(ms) {
let addS = (n) => n == 1 ? '' : 's';
let d = ms / 8.64e7 | 0;
let h = (ms % 8.64e7) / 3.6e6 | 0;
let m = (ms % 3.6e6) / 6e4 | 0;
let s = (ms % 6e4) / 1e3 | 0;
let t = [
d + ' day' + addS(d),
h + ' hour' + addS(m),
m + ' minute' + addS(h),
s + ' second' + addS(s)
];
return ms > 0 ? t.join(', ') : "Time is over";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xdate@0.8.2/src/xdate.js"></script>
<div id="timeForSign"></div>
在这个脚本中,我使用了一些函数和 xDate 库来创建真正格式的日期。我正在尝试制作一个小脚本,实时显示两个日期与时间之间的差异,但我没有在代码中看到不允许这样做的错误。哪里出错了?
jQuery(window).on("load", function() {
function parseISOLocal(s) {
// Split string into its parts
var b = s.split(/\D/);
// Create and return a date object
return new Date(b[0], b[1] - 1, b[2], b[3], b[4], b[5]);
}
// Convert a millisecond value to days, hours, minutes and seconds
function formatDHMS(ms) {
// Helper to add 's' to a number if other than 1
function addS(n) {
return n == 1 ? '' : 's';
}
var d = ms / 8.64e7 | 0;
var h = (ms % 8.64e7) / 3.6e6 | 0;
var m = (ms % 3.6e6) / 6e4 | 0;
var s = (ms % 6e4) / 1e3 | 0;
dd = (d != 0) ? d + ' day' + addS(d) + ', ' : "";
hh = (h != 0) ? h + ' hours' + addS(h) + ', ' : "";
mm = (m != 0) ? m + ' minute' + addS(m) + ', ' : "";
ss = (s != 0) ? s + ' second' + addS(s) + ' ' : "";
return ((d + h + m + s) > 0) ? dd + hh + mm + ss : "Time is over";
}
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
var date = new Date("2020-05-01 12:24:23");
var d1 = new XDate(date.addDays(2));
future_time = d1.toString("yyyy-MM-dd HH:mm:ss");
var d = new XDate();
current_time = d.toString("yyyy-MM-dd HH:mm:ss");
var someDate = new Date();
someDate.setDate(someDate.getDate() + 15); //number of days to add, e.x. 15 days
var dateFormated = someDate.toISOString().substr(0, 10);
console.log(dateFormated);
function Repeat() {
setInterval(function() {
current_time = d.toString("yyyy-MM-dd HH:mm:ss");
$('#timeForSign').html(formatDHMS(parseISOLocal(future_time) - parseISOLocal(current_time)));
}, 100);
}
setTimeout(Repeat, 500);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="http://www.outsourcer.info/xdate.js"></script>
<div id="timeForSign"></div>
问题是因为您只比较区间内的 d
值,而该值永远不会改变。要解决此问题,您只需将 d
更改为 new Date()
,或 new XDate()
,如果您更愿意使用该库:
current_time = new XDate().toString("yyyy-MM-dd HH:mm:ss");
此外,您的 JS 中还有很多不需要的变量,可以删除。试试这个:
jQuery(window).on("load", function() {
let future_time = parseISOLocal(new XDate(new Date("2020-05-01 12:24:23").addDays(2)).toString("yyyy-MM-dd HH:mm:ss"));
function Repeat() {
setInterval(function() {
let current_time = new XDate().toString("yyyy-MM-dd HH:mm:ss");
$('#timeForSign').html(formatDHMS(future_time - parseISOLocal(current_time)));
}, 100);
}
setTimeout(Repeat, 500);
});
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
function parseISOLocal(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1] - 1, b[2], b[3], b[4], b[5]);
}
function formatDHMS(ms) {
let addS = (n) => n == 1 ? '' : 's';
let d = ms / 8.64e7 | 0;
let h = (ms % 8.64e7) / 3.6e6 | 0;
let m = (ms % 3.6e6) / 6e4 | 0;
let s = (ms % 6e4) / 1e3 | 0;
let t = [
d + ' day' + addS(d),
h + ' hour' + addS(m),
m + ' minute' + addS(h),
s + ' second' + addS(s)
];
return ms > 0 ? t.join(', ') : "Time is over";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xdate@0.8.2/src/xdate.js"></script>
<div id="timeForSign"></div>