0

So I have this clock script:

function digitalWatch(timestamp) {
    var date = new Date(timestamp);
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var seconds = date.getSeconds();
    if (hours < 10) hours = "0" + hours;
    if (minutes < 10) minutes = "0" + minutes;
    if (seconds < 10) seconds = "0" + seconds;
    document.getElementById("digital_watch").innerHTML = hours + ":" + minutes + ":" + seconds;
    setTimeout(function(){digitalWatch(timestamp+1)}, 1000);
}
digitalWatch(<<here I pass a UNIX timestamp from server>>)

The clock don't work. I debuged it with console.log() and I saw that timestamp incremented correctly but the Date() constructor returns the same result again and again.

Someone knows what's the problem here? And how can I solve it?

4

1 回答 1

3

UNIX 时间戳以秒计,JavaScript 时间戳以毫秒计。

您应该将传递的时间戳乘以 1000,例如:

var date = new Date(timestamp * 1000);

这不仅会修复初始转换,而且会确保当您添加一秒(在计时器回调中)时,您实际上确实添加了 1 秒,而不仅仅是 1 毫秒。后者是您似乎得到相同Date对象的原因 - 您几乎可以肯定不是,但新对象仅比前一个对象晚 1 毫秒,因此大多数HH:MM:SS时间会显示相同的值。

在实践中,请注意,您会发现这setTimeout并不能保证事件会以 1000 毫秒的间隔触发,因此您会得到一些时钟漂移。

您应该考虑到前面的代码也需要运行多长时间 - 实际上更好的方法可能是简单地确定最初提供的时间戳和本地计算机时间之间的差异,并将其用作所有后续调用的参考值。

于 2013-09-19T10:51:24.637 回答