15

JavaScript中是否有任何现成的东西(即不是通过“插件”)允许我做类似的事情setTimeout,但不是说应该在多少毫秒内发生某事,而是给它一个日期对象告诉它什么时候做某事?

setToHappen(function () {
    alert('Wake up!');
}, new Date("..."));

是的,我知道我可以通过简单地减去new Date()我现有的日期对象(或者可能是相反的方式)来获得毫秒数,但我仍然想知道。

4

4 回答 4

29

您必须计算从现在到您的日期对象之间的毫秒数:

function setToHappen(fn, date){
    return setTimeout(fn, date - Date.now());
}

注意请注意@calvin 的回答:如果毫秒数大于2147483647.

于 2009-04-23T09:46:05.353 回答
8

不,但您可以轻松编写自己的函数。只需计算现在与给定时刻之间的差异(以毫秒为单位),然后调用 setTimeout 即可。

像这样的东西:

 setToHappen = function(fn, date){
  var now = new Date().getTime();
  var diff = date.getTime() - now;
  return setTimeout(fn, diff);
 }

编辑:删除了 1000 的额外乘法,感谢克里斯指出这一点!

于 2009-04-23T09:44:57.087 回答
8

由于人们正在谈论使用date对象计算超时间隔,因此应该注意间隔参数可接受的最大值setTimeout()是 2147483647 (2^31 - 1),因为PRIntervalTime它是带符号的 32 位整数。结果不到25天。

于 2009-04-23T10:04:52.890 回答
3

您可以简单地Date.now()从日期中减去

const myDate = new Date('...');
setTimeout(func, myDate - Date.now());
于 2019-09-06T08:55:42.620 回答