获取最接近当前日期的日期 (javascript)
Get closest date to current date (javascript)
所以我有一个日期数组,想要获取当前日期并将其放入倒计时时钟
我有这个代码 atm:
<script>
var dates = [
'24/5/2017',
'12/6/2017',
'14/6/2017',
'16/6/2017',
'20/6/2017',
'20/6/2017',
'22/6/2017',
'23/6/2017',
'26/6/2017'
];
function sortDates(dates) {
return dates.map(function(date) {
return new Date(date).getTime();
}).sort(function(a, b) {
return a - b;
});
}
var orderedDates = sortDates(dates);
document.getElementById("demoo").innerHTML = orderedDates
var nextDate = orderedDates.filter(function(date) {
return (var now = new Date().getTime(); - date) > 0;
})[0];
document.getElementById("demo").innerHTML = nextDate
var x = setInterval(function() {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now an the count down date
var distance = nextDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Output the result in an element with id="demo"
document.getElementById("demo").innerHTML = days + "d " + hours + "h "
+ minutes + "m " + seconds + "s ";
// If the count down is over, write some text
if (distance < 0) {
clearInterval(x);
document.getElementById("demo").innerHTML = "EXPIRED";
}
}, 1000);
</script>
<center><h2>Core Maths 2</h2><center>
这好像没什么用,所以我真的不知道该怎么做。目前它只是为倒计时提出了 NAN
一个问题是,例如,new Date('24/5/2017')
产生 Invalid Date
。我不认为这是 new Date()
.
识别的有效日期格式
如果你真的需要这样的格式,你可以这样做:
var dates = [
'24/5/2017', // past Date for testing
'12/6/2017',
'14/6/2017',
'16/6/2017',
'20/6/2017',
'20/6/2017',
'22/6/2017',
'23/6/2017',
'26/6/2017'
].map(function (d) {
var parts = d.split('/');
return new Date(parts[2], parts[1] - 1 /* january = 0 */, parts[0]);
});
因此,通过按顺序将参数传递给它理解的 Date 构造函数,您最终会得到实际的 Date 对象而不是字符串。
另一点:由于您可以将 Date 对象解释为数字(产生与 new Date().getTime()
相同的结果,即自 1970 年 1 月 1 日以来的毫秒数),您可以简单地使用以下方法获得最小值:Math.min.apply(Math, dates)
。因此,您的 "next Date"(不在过去的最小时间戳)可以简单地通过 var nextDate = new Date(Math.min.apply(Math, dates.filter(x => +x > Date.now())));
检索
下面是一个工作片段,它应该可以满足您的要求。
var dates = [
'20/4/2017',
'24/5/2017',
'12/6/2017',
'14/6/2017',
'16/6/2017',
'20/6/2017',
'20/6/2017',
'22/6/2017',
'23/6/2017',
'26/6/2017'
].map(function (d) {
var parts = d.split('/');
return new Date(parts[2], parts[1] - 1 /* january = 0 */, parts[0]);
});
var nextDate = new Date(Math.min.apply(Math, dates.filter(x => +x > Date.now())));
var x = setInterval(function() {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now an the count down date
var distance = nextDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Output the result in an element with id="demo"
document.getElementById("demo").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s ";
// If the count down is over, write some text
if (distance < 0) {
clearInterval(x);
document.getElementById("demo").innerHTML = "EXPIRED";
}
}, 1000);
<center><h2>Core Maths 2</h2><center>
<div id="demo"></div>
所以我为你完成了脏活累活,你需要做的只是一些调试,在这里和那里放置一些控制台日志以找出问题所在,这是几件事。
1。你的日期格式搞砸了(至少对我来说)。
如果您希望它在将其传递给 Date()
构造函数时正确运行,则不要键入“24/5/2017”,而是键入“5/24/2017”。您可以通过这样做来验证这一点:console.log(new Date('24/5/2017'));
2。你的过滤功能不好
您想要下一个日期,尽管您检查了 now - date > 0
,这意味着只有过去的日期才有效。使用 date - now > 0
或 now - date < 0
.
3。你打错了
document.getElementById("demoo").innerHTML = orderedDates
注意 'demoo' 中的额外 'o'。
4。您使用了无效语法
var nextDate = orderedDates.filter(function(date) {
return (var now = new Date().getTime(); - date) > 0;
})[0];
这不起作用,因为您不能这样声明 now
。将 now
的声明提取到 return
语句上方的一行,如下所示:
var nextDate = orderedDates.filter(function(date) {
var now = new Date().getTime();
return (now - date) < 0;
})[0];
如果您应用所有这些更正,您的倒计时应该会起作用。
所以我有一个日期数组,想要获取当前日期并将其放入倒计时时钟 我有这个代码 atm:
<script>
var dates = [
'24/5/2017',
'12/6/2017',
'14/6/2017',
'16/6/2017',
'20/6/2017',
'20/6/2017',
'22/6/2017',
'23/6/2017',
'26/6/2017'
];
function sortDates(dates) {
return dates.map(function(date) {
return new Date(date).getTime();
}).sort(function(a, b) {
return a - b;
});
}
var orderedDates = sortDates(dates);
document.getElementById("demoo").innerHTML = orderedDates
var nextDate = orderedDates.filter(function(date) {
return (var now = new Date().getTime(); - date) > 0;
})[0];
document.getElementById("demo").innerHTML = nextDate
var x = setInterval(function() {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now an the count down date
var distance = nextDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Output the result in an element with id="demo"
document.getElementById("demo").innerHTML = days + "d " + hours + "h "
+ minutes + "m " + seconds + "s ";
// If the count down is over, write some text
if (distance < 0) {
clearInterval(x);
document.getElementById("demo").innerHTML = "EXPIRED";
}
}, 1000);
</script>
<center><h2>Core Maths 2</h2><center>
这好像没什么用,所以我真的不知道该怎么做。目前它只是为倒计时提出了 NAN
一个问题是,例如,new Date('24/5/2017')
产生 Invalid Date
。我不认为这是 new Date()
.
如果你真的需要这样的格式,你可以这样做:
var dates = [
'24/5/2017', // past Date for testing
'12/6/2017',
'14/6/2017',
'16/6/2017',
'20/6/2017',
'20/6/2017',
'22/6/2017',
'23/6/2017',
'26/6/2017'
].map(function (d) {
var parts = d.split('/');
return new Date(parts[2], parts[1] - 1 /* january = 0 */, parts[0]);
});
因此,通过按顺序将参数传递给它理解的 Date 构造函数,您最终会得到实际的 Date 对象而不是字符串。
另一点:由于您可以将 Date 对象解释为数字(产生与 new Date().getTime()
相同的结果,即自 1970 年 1 月 1 日以来的毫秒数),您可以简单地使用以下方法获得最小值:Math.min.apply(Math, dates)
。因此,您的 "next Date"(不在过去的最小时间戳)可以简单地通过 var nextDate = new Date(Math.min.apply(Math, dates.filter(x => +x > Date.now())));
下面是一个工作片段,它应该可以满足您的要求。
var dates = [
'20/4/2017',
'24/5/2017',
'12/6/2017',
'14/6/2017',
'16/6/2017',
'20/6/2017',
'20/6/2017',
'22/6/2017',
'23/6/2017',
'26/6/2017'
].map(function (d) {
var parts = d.split('/');
return new Date(parts[2], parts[1] - 1 /* january = 0 */, parts[0]);
});
var nextDate = new Date(Math.min.apply(Math, dates.filter(x => +x > Date.now())));
var x = setInterval(function() {
// Get todays date and time
var now = new Date().getTime();
// Find the distance between now an the count down date
var distance = nextDate - now;
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Output the result in an element with id="demo"
document.getElementById("demo").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s ";
// If the count down is over, write some text
if (distance < 0) {
clearInterval(x);
document.getElementById("demo").innerHTML = "EXPIRED";
}
}, 1000);
<center><h2>Core Maths 2</h2><center>
<div id="demo"></div>
所以我为你完成了脏活累活,你需要做的只是一些调试,在这里和那里放置一些控制台日志以找出问题所在,这是几件事。
1。你的日期格式搞砸了(至少对我来说)。
如果您希望它在将其传递给 Date()
构造函数时正确运行,则不要键入“24/5/2017”,而是键入“5/24/2017”。您可以通过这样做来验证这一点:console.log(new Date('24/5/2017'));
2。你的过滤功能不好
您想要下一个日期,尽管您检查了 now - date > 0
,这意味着只有过去的日期才有效。使用 date - now > 0
或 now - date < 0
.
3。你打错了
document.getElementById("demoo").innerHTML = orderedDates
注意 'demoo' 中的额外 'o'。
4。您使用了无效语法
var nextDate = orderedDates.filter(function(date) {
return (var now = new Date().getTime(); - date) > 0;
})[0];
这不起作用,因为您不能这样声明 now
。将 now
的声明提取到 return
语句上方的一行,如下所示:
var nextDate = orderedDates.filter(function(date) {
var now = new Date().getTime();
return (now - date) < 0;
})[0];
如果您应用所有这些更正,您的倒计时应该会起作用。