【问题标题】:Javascript comparing two dates has wrong result比较两个日期的Javascript有错误的结果
【发布时间】:2014-06-03 03:39:43
【问题描述】:

我正在努力学习更多关于 JavaScript 的知识,并决定制作一个倒计时计时器,它的显示时间从几年一直到毫秒。这对我来说只是一个学习实验。

分钟不正确。如果我刷新浏览器,秒和分钟总是从 59 开始。我认为这可能是因为我正在调用 Date 对象并可能重置它。我正在寻找的是倒计时到某个日期。

因为这对我来说是一个学习实验,如果您看到其他可以改进的地方,请告诉我。

var dateA = new Date();
var dateB = new Date('June 3, 2014 00:27:00');
var cntr  = setInterval(clock, 10);

function clock()
{
  dateB = (dateB - 10);
  var date = new Date(dateB);
  var yrs  = Math.abs(date.getUTCFullYear() - dateA.getUTCFullYear() );
  var mos  = Math.abs(date.getUTCMonth() - dateA.getUTCMonth());
  var days = Math.abs(date.getUTCDate() - dateA.getUTCDate());
  var hrs  = Math.abs(date.getUTCHours() - dateA.getUTCHours());
  var mins = Math.abs(date.getUTCMinutes() - dateA.getUTCMinutes());
  var secs = Math.ceil(date.getUTCSeconds() - dateA.getUTCSeconds() / 60);
  var mill = Math.ceil(date.getUTCMilliseconds() - dateA.getUTCMilliseconds() / 999);
  var str  =
    yrs  + ' Years   '  +
    mos  + ' Months   ' +
    days + ' Days   '   +
    hrs  + ' Hours   '  +
    mins + ' Mins   '   +
    secs + ' Secs   '   +
    mill + ' Mill';
  document.getElementById('clock').innerHTML = str;
}

【问题讨论】:

  • 这是什么 - dateB = (dateB - 10);
  • 这是从原始日期对象倒数。
  • setInterval 每 10 毫秒调用一次时钟函数。为了减少时钟功能,我需要dateB = (dateB - 10)。在没有它的情况下回显 dateB 的值什么都不会。

标签: javascript


【解决方案1】:
var yrs  = Math.abs(date.getUTCFullYear() - dateA.getUTCFullYear() );
var mos  = Math.abs(date.getUTCMonth() - dateA.getUTCMonth());
var days = Math.abs(date.getUTCDate() - dateA.getUTCDate());
var hrs  = Math.abs(date.getUTCHours() - dateA.getUTCHours());
var mins = Math.abs(date.getUTCMinutes() - dateA.getUTCMinutes());

不能只取日期各部分差异的绝对值!你最终得到完全错误的数字。

var secs = Math.ceil(date.getUTCSeconds() - dateA.getUTCSeconds() / 60);
var mill = Math.ceil(date.getUTCMilliseconds() - dateA.getUTCMilliseconds() / 999);

为什么要将这些除以 60 和近 1000?!

相反,要计算时间差,您需要获取完整的差值(通常以毫秒为单位)并将其转换为不同的单位。您的函数应如下所示:

var el = document.getElementById('clock');
function clock() {
  var diff = dateB - Date.now();
  var yrs  = Math.floor(diff / 31536000000);
  var mos  = Math.floor(diff / 2678400000) % 12;
  var days = Math.floor(diff / 86400000)   % 31;
  var hrs  = Math.floor(diff / 3600000)    % 24;
  var mins = Math.floor(diff / 60000)      % 60;
  var secs = Math.floor(diff / 1000)       % 60;
  var mill =            diff               % 1000;
  var str  =
    yrs  + ' Years   '  +
    mos  + ' Months   ' +
    days + ' Days   '   +
    hrs  + ' Hours   '  +
    mins + ' Mins   '   +
    secs + ' Secs   '   +
    mill + ' Mill';
  el.innerText = str;
}

【讨论】:

  • 感谢 Bergi 提供的示例。在您进行编辑之前,我不知道您要解释什么,但是通过这个示例,我现在可以清楚地看到。谢谢。
  • Bergi,您能告诉我您是如何到达2678400000 进行月份计算的吗?
  • 我刚刚估计一个月有 31 天,也就是 2678400000 毫秒。可能会有更好的想法。
  • 没关系,谢谢。我明白我做错了什么。再次感谢您通过这个 sn-p 让我走上正轨。
【解决方案2】:

如果您使用 javascript 来比较日期或计算天数,您可能会遇到一些问题。您应该使用库以获得更好的结果。

我建议您使用http://momentjs.com/ 来获取日期或时间功能。它易于使用且更加灵活。

这应该回答你的问题:Countdown timer using Moment js

【讨论】:

  • 谢谢。我现在正在看那个。有没有办法使用直接 JS 来做到这一点?同样,这对我来说只是一个学习实验。
  • 当然,Moment.js 是用 Javascript 编写的。
  • :) 我知道它是用 JavaScript 编写的,但我要的是不依赖外部库。我可以在没有图书馆的情况下这样做吗?
  • 好吧,我已经用直接的 JS 做了类似的事情,它给我带来了很多问题、意想不到的结果和更长的代码。使用 momentJs,我可以用更少的代码和更好的结果做同样的事情。
  • 所有这些“Math.abs(date.getUTCFullYear() - dateA.getUTCFullYear());”比较时给出不准确的结果。
【解决方案3】:
try this..

function checkFromDate(sender, args) {
    if (sender._selectedDate > new Date()) {
        alert("You cannot select a day future than today.");
        sender._selectedDate = new Date();
        sender._textbox.set_Value(sender._selectedDate.format(sender._format))
    }
}

【讨论】:

  • 谢谢桑迪普。这究竟对我有什么帮助?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多