检测午夜和重置数据的最佳方法

时间:2014-10-15 16:04:24

标签: javascript jquery momentjs

我一直在开发一个Web应用程序Dashboard,我想知道如何检测那是午夜,以便使用jquery或momentjs重置一些包含前一天数据的数组。

5 个答案:

答案 0 :(得分:12)

使用以moment().format("h:mm:ss")格式返回时间的h:mm:ss

var midnight = "0:00:00";
var now = null;

setInterval(function () {
    now = moment().format("H:mm:ss");
    if (now === midnight) {
        alert("Hi");
    }
    $("#time").text(now);
}, 1000);

JSFIDDLE

更好的方法是计算直到午夜的秒数。使用MomentJS非常简单且易读:

// returns the number of seconds until next midnight
moment("24:00:00", "hh:mm:ss").diff(moment(), 'seconds');

所以,就这样做:

setTimeout(
   midnightTask,
   moment("24:00:00", "hh:mm:ss").diff(moment(), 'seconds')
);

function midnightTask() {
  /* do something */
}

JSFIDDLE

答案 1 :(得分:5)

只有两种方法可以实现这个目标

  1. 每x秒轮询一次,看看我们是否在午夜的x秒内
  2. 计算从现在到午夜之间的时间,并在执行
  3. 之前休眠一段时间

    (1)已经在其他答案中得到证实,这里是(2)。

    首先要做的是calculate the number of milliseconds until midnight,然后将其用作javascripts setTimeout的参数。

    setTimeout(function(){
      // whatever you want to do at midnight
    }, msToMidnight);
    

    在完成该功能的工作后,您可能想要重新计算 next 午夜的时间并重复该过程。

答案 2 :(得分:3)

所以我认为你以错误的方式解决这个问题。你正在寻找的东西不是午夜,你只想知道什么时候发生了变化,这是一个更简单的任务。

我要说的第一件事就是不惜一切代价避免使用计时器。他们不值得。每天运行相同功能> 3600次所带来的性能损失和额外的CPU时间是荒谬的,特别是当它在别人的计算机上运行时。你不知道它能处理多少,所以假设它根本无法处理。轻松了解您的用户。

我建议听一下用户输入事件,假设这是普通计算机上的内容,而不是something like this,没有用户输入。

如果用户输入事件是您可以依赖的事情,我会这样做..

var today = new Date(), lastUpdate;

window.addEventListener( "mousemove", function () {
  var time = new Date();
  // If we haven't checked yet, or if it's been more than 30 seconds since the last check
  if ( !lastUpdate || ( time.getTime() - lastUpdate.getTime() ) > 30000 ) {
    // Set the last time we checked, and then check if the date has changed.
    lastUpdate = time
    if ( time.getDate() !== today.getDate() ) {
      // If the date has changed, set the date to the new date, and refresh stuff.
      today = time

      this_is_where_you_would_reset_stuff()
    }
  }
} )

如果您绝对需要使用计时器,那么我会这样做..

function init() {
  var today = new Date();
  var midnight = new Date();

  midnight.setDate( today.getDate() + 1 )
  midnight.setHours( 0 )
  midnight.setMinutes( 0 )

  setTimeout( function () {
    // If the date has changed, set the date to the new date, and refresh stuff.
    today = time

    this_is_where_you_would_reset_stuff()

    init()
  }, midnight.getTime() - today.getTime() )
}

init()

请记住,第二种方式可能性要差得多。

答案 3 :(得分:0)

我会尝试:

window.setInterval(resetAtMidnight, 1000*5) // every five seconds
function resetAtMidnight() {
  var now = new Date();
  if(now.getHours() < 1
   && now.getMinutes() < 1
   && now.getSeconds() < 5 ) {
    redrawPage();
  }
};

答案 4 :(得分:0)

在今天午夜创建一个日期,添加86400秒,然后设置超时:

new Date(Date.parse((new Date()).toString().replace(/\d\d:\d\d:\d\d/,'00:00:00')) + 86400 * 1000)

以下是您如何使用它:

var delay_to_midnight = Date.parse((new Date()).toString().replace(/\d\d:\d\d:\d\d/,'00:00:00')) + 86400 * 1000 - Date.now()
var timeoutid = window.setTimeout(function() { alert("It's midnight!"); }, delay_to_midnight);