Javascript 设置超时,但在给定时间内

Javascript 设置超时,但在给定时间内,javascript,datetime,settimeout,Javascript,Datetime,Settimeout,JavaScript中是否有任何现成的东西(即不是通过“插件”)允许我执行类似于setTimeout的操作,但是我给它一个日期对象,告诉它什么时候做什么,而不是说应该在多少毫秒内发生什么事情 setToHappen(function () { alert('Wake up!'); }, new Date("...")); 是的,我知道我可以通过简单地用我现有的日期对象减去new Date()来获得毫秒数,但我仍然想知道。不,但是你可以很容易地编写自己的函数。只需计算现在和给定时刻之间的

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

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

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

不,但是你可以很容易地编写自己的函数。只需计算现在和给定时刻之间的差值(以毫秒为单位),然后调用setTimeout

大概是这样的:

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

编辑:删除了1000的额外乘法,谢谢chris指出这一点

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

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

NB请注意:如果毫秒数大于
2147483647

这将不起作用,因为人们正在谈论使用
date
对象计算超时间隔,应该注意的是,
PRIntervalTime
是一个有符号的32位整数。结果不到25天。

您只需从日期中减去
Date.now()

const myDate=新日期(“…”);
setTimeout(func,myDate-Date.now());

你不需要乘以1000才能得到毫秒吗?@Pim,不,你不需要getTime()返回1970年1月1日00:00:00和相应日期对象之间的毫秒数。啊,好的,我以为是秒。请注意,这是“99%”正确的。如果系统时钟更改,它将不会在“d”处执行“fn”。不仅更改系统时钟是一个问题。当您以睡眠模式发送系统时,将执行modus fn,以确定稍后的睡眠时间。