获取最接近当前日期的日期 (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 > 0now - 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];

如果您应用所有这些更正,您的倒计时应该会起作用。