2014-10-15 8 views
5

Ho sviluppato un dashboard dell'applicazione Web e mi chiedevo come rilevare che è mezzanotte per reimpostare alcuni array che contengono dati del giorno precedente utilizzando jquery o momentjs.Modo migliore per rilevare la mezzanotte e ripristinare i dati

+0

Stai parlando di server o client? Non sono sicuro che tu voglia farlo sul client ... –

+0

Sto parlando del cliente. L'unica cosa che non voglio è aggiornare la pagina. Quello che voglio, ad esempio, è questo: immaginando di avere un array con i dati, voglio resettare questo array. Inoltre, non desidero controllare (se possibile) ogni 5 secondi se si tratta di mezzanotte –

+0

Ok, come si definisce * mezzanotte *? Questa ora è '0: 00'? –

risposta

7

Usa moment().format("h:mm:ss") che restituisce il tempo in un formato 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

Un modo migliore sarebbe quello di calcolare i secondi fino a mezzanotte. Questo è leggibile con MomentJS molto semplice e umano:

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

Quindi, basta fare:

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

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

JSFIDDLE

+0

La seconda soluzione (setTimeout) non funzionerà se il computer si spegne e riprende molto più tardi. In tali casi, il trigger verrà ritardato di circa il tempo impiegato dal computer in modalità di sospensione. –

0

vorrei provare:

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

Perché rendere la CPU più difficile del necessario. 1000 * 5 = 5000, perché non basta passare in 5000 –

+0

Questa ripetizione o eseguirà la funzione una sola volta, dopo un ritardo di 5 secondi? – gibberish

+0

@gibberish - questo verrebbe eseguito una sola volta, per ripetere l'uso di 'setInterval' (o chiamare di nuovo' setTimeout') – Jamiec

4

C'è veramente solo due modi per ottenere questo

  1. sondaggio ogni x secondi e vedere se siamo entro x secondi dalla mezzanotte
  2. calcolare il tempo tra oggi e la mezzanotte, e dormire per quel lasso di tempo prima di eseguire

(1) è stata dimostrata in altre risposte, ecco (2).

La prima cosa da fare è calculate the number of milliseconds until midnight quindi utilizzarlo come parametro per javascript setTimeout.

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

Dopo aver finito il lavoro in quella funzione, si potrebbe desiderare di recaculate il tempo fino prossimo mezzanotte e ripetere il processo.

0

Creare un appuntamento a mezzanotte di questa mattina, aggiungi 86400 secondi, e impostare un timeout per poi:

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

Ecco come ci si utilizza:

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

Così si pensa' andando su questo nel modo sbagliato. Quello che stai cercando non è quando è mezzanotte, vuoi solo sapere quando il giorno è cambiato, il che è un compito molto più semplice.

La prima cosa che dirò è evitare l'uso dei timer a tutti i costi. Non ne vale la pena. Il risultato in termini di prestazioni e il tempo extra della CPU che si ottiene dall'esecuzione della stessa funzione> 3600 volte al giorno sono ridicoli, specialmente quando è in esecuzione sul computer di qualcun altro. Non sai quanto può gestire, quindi supponi che non possa gestire molto. Vacci piano con i tuoi utenti.

Vorrei suggerire l'ascolto di un evento di input dell'utente, supponendo che questo è qualcosa che avrebbe su un normale computer, e non something like this, dove non c'è l'input dell'utente.

Se gli eventi di input dell'utente sono qualcosa che si poteva fare affidamento su, vorrei fare questo ..

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() 
    } 
    } 
}) 

Se è assolutamente necessario utilizzare un timer, quindi vorrei fare questo ..

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

Ricorda che la seconda via probabilmente sarà molto meno affidabile.

+0

Il problema con questo approccio è che questo dashboard deve essere visualizzato in un monitor e l'utente vede solo i dati che cambiano. Ma grazie per il tuo suggerimento –

Problemi correlati