【问题标题】:Making an alarm clock with date time用日期时间制作闹钟
【发布时间】:2017-03-11 16:56:29
【问题描述】:

我正在尝试制作一个闹钟,它会在完成后播放声音。所以,例如,我将闹钟的开始时间设置为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

【问题讨论】:

  • 你的 var x 甚至不是一个会导致未定义令牌的字符串。
  • 您在编写 JS 时使用开发者控制台吗?
  • @Roljhon 对不起,我没有正确粘贴它,正在更改它
  • @RokoC.Buljan 我得到了 NAN

标签: javascript date time


【解决方案1】:

您的问题是x 的定义方式。您的代码背后的逻辑是可靠的,但是您需要使用一些相当智能的日期时间操作来实现这一点。举个例子,让我们设置从页面加载开始的五秒钟的闹钟:

x = new Date();
x.setSeconds(x.getSeconds() + 5);
var t = new Date(x) - new Date();
setTimeout(function(){ alert("Hello"); }, t);

我建议您查看Date 并找出解决问题所需的逻辑和方法。

粗略的解决方案

仅基于小时的警报逻辑应该是这样的:

  • 使用当前日期、月份等从闹钟时间的 HH:mm:ss 创建一个虚拟日期。
  • new Date() 比较,看看它是在当前日期之前还是之后。
  • 如果在当前日期之前,则将 x 设置为明天和您获得的 HH:mm:ss。
  • 否则设置为今天和 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);

注意事项:

  • HH:mm:ss 指的是小时:分钟:秒格式(更多信息请参见here)。
  • 我还使用一个对象来代替您的x,以使转换更容易。您可以轻松地从字符串构建对象。

【讨论】:

  • 您好,感谢您的回答!所以基本上我需要将我的 X 更改为 new Date 可以理解的东西?我实际上不确定如何使用此示例修复我的代码...
  • @MasnadNihit 我添加了第二个 sn-p 和一些逻辑来更好地解释如何处理这个问题。
  • 非常感谢!!在大家的帮助下,我现在明白了:)
【解决方案2】:

类似这样的:

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);

【讨论】:

  • 为什么我必须使用开始日期?开始日期不能只是新日期吗?
  • 这是一个不错的选择,Math.abs() 真是个聪明的主意!
  • @MasnadNihit 如果您想从解决方案中减去日期,这是一个很好的例子:stackoverflow.com/questions/1787939/…
  • @MattWebb 非常感谢您的帮助!!!我现在更好地理解它了
【解决方案3】:

我希望这能让你清楚地了解你现在拥有什么以及如何做到这一点,但是有很多方法可以做到这一点,我只是想让你更容易。

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)

【讨论】:

  • 非常感谢!这个答案解释得很好。
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多