2014-10-15 4 views
5

Я разрабатывал панель инструментов веб-приложения, и мне было интересно, как обнаружить, что это полночь, чтобы сбросить некоторые массивы, содержащие данные из предыдущего дня, используя jquery или momentjs.Лучший способ обнаружить полночь и сбросить данные

+0

Вы говорите о сервере или клиенте? Я не уверен, что вы хотите сделать это на клиенте ... –

+0

Я говорю о клиенте. Единственное, чего я не хочу, это обновить страницу. Например, я хочу: визуализация того, что у вас есть массив с данными, я хочу сбросить этот массив. Я также не хочу проверять (если возможно) каждые 5 секунд, если находится midnigth –

+0

Хорошо, как вы определяете * полночь *? Это '0: 00' час? –

ответ

7

Использование 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

+0

Второе решение (setTimeout) не будет работать, если компьютер перейдет в режим сна и возобновит работу намного позже. В таких случаях триггер будет задерживаться примерно столько же времени, сколько компьютер, проведенный в спящем режиме. –

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(); 
    } 
}; 
+0

Зачем нужно, чтобы процессор работал сложнее, чем нужно. 1000 * 5 = 5000, почему бы не просто пройти в 5000 –

+0

Будет ли это повторяться, или просто запустить функцию один раз, после 5-секундной задержки? – gibberish

+0

@gibberish - это будет работать только один раз, чтобы повторить вы используете 'setInterval' (или снова вызовите' setTimeout') – Jamiec

4

Там только действительно два пути для достижения этой

  1. опроса каждого х секунд и посмотреть, не находимся ли мы в пределах x секунд полуночи
  2. Подсчитайте время между настоящим и полуночным и спящим на это время до выполнения

(1) было продемонстрировано в других ответах, здесь (2).

Первое, что нужно сделать, это calculate the number of milliseconds until midnight, а затем использовать это как параметр для javascripts setTimeout.

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

После того, как вы закончили свою работу в этой функции, вы можете захотеть, чтобы recaculate времени до следующей полуночи и повторить процесс.

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

Так что я думаю, что вы» Повторяю это неправильно. То, что вы ищете, это не когда полночь, вы просто хотите знать, когда изменился день, что намного проще.

Первое, что я собираюсь сказать, - избегать использования таймеров любой ценой. Они не стоят того. Снижение производительности и дополнительное время процессора, которое вы используете при работе с той же функцией> 3600 раз в день, смешно, особенно когда он работает на чужом компьютере. Вы не знаете, как много он может справиться, поэтому предположите, что он не может справиться вообще. Легко пройдите на своих пользователей.

Я бы посоветовал прислушаться к событию ввода пользователя, предполагая, что это будет что-то, что у вас было бы на обычном компьютере, а не 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() 

Имейте в виду, что второй способ, вероятно, будет гораздо менее надежным.

+0

Проблема с этим подходом заключается в том, что эта панель мониторинга должна отображаться на мониторе, и пользователь видит только изменение данных. Но спасибо за ваше предложение –

Смежные вопросы