我正在尝试制作一个闹钟,它会在完成时发出声音。因此,例如,我设置警报应该从18:00:00
开始并且当前时间为17:59:00
的时间,因此基本上警报应该在1分钟内启动。
我尝试过这样做。:
var x = '18:00:00';
var t = new Date(x) - new Date();
setTimeout(function(){ alert("Hello"); }, t);
这不起作用,不知道为什么。错误是NaN
。
答案 0 :(得分:6)
您的问题是定义x
的方式。代码背后的逻辑是可靠的,但是你需要使用一些合理的智能日期时间操作来实现这一点。例如,让我们将闹钟设置为从加载页面开始的五秒钟:
x = new Date();
x.setSeconds(x.getSeconds() + 5);
var t = new Date(x) - new Date();
setTimeout(function(){ alert("Hello"); }, t);

我建议您查看Date并找出解决问题所需的逻辑和方法。
仅基于小时数的警报逻辑应该是这样的:
new Date()
比较,看它是在当前日期之前还是之后。x
设置为明天,并将HH:mm:ss设置为。以下代码演示了如何实现此目的:
var x = {
hours: 18,
minutes: 0,
seconds: 0
};
var dtAlarm = new Date();
dtAlarm.setHours(x.hours);
dtAlarm.setMinutes(x.minutes);
dtAlarm.setSeconds(x.seconds);
var dtNow = new Date();
if (dtAlarm - dtNow > 0) {
console.log('Later today, no changes needed!');
}
else {
console.log('Tomorrow, changing date to tomorrow');
dtAlarm.setDate(dtAlarm.getDate() + 1);
}
var diff = dtAlarm - new Date();
setTimeout(function(){ alert("Hello"); }, diff);

注意:
x
来简化转换。您可以从字符串轻松构建对象。答案 1 :(得分:3)
这样的事情:
var start = '2017/03/11 12:00:00';
var end = '2017/03/11 12:00:02';
// time in milliseconds:
var time = Math.abs(new Date(start) - new Date(end));
setTimeout(function(){
alert("Hello");
}, time);
答案 2 :(得分:2)
我希望这会让你清楚地了解你现在拥有的以及如何做到这一点,但有很多方法可以做到这一点,我只是想让你更容易。
let x = "01:10:30"; //any value you will pass
let date1 = new Date();
//split your x string into hours,minutes and seconds
date1.setHours(x.split(":")[0]); //set hours
date1.setMinutes(x.split(":")[1]); //set minutes
date1.setSeconds(x.split(":")[2]); //set seconds
let t = date1 - new Date();
setTimeout(function(){alert('Hello')},t)