2015-05-26 2 views
6

Sto tentando di implementare un timer per il conto alla rovescia in un momento specifico in futuro. Questo punto nel tempo è sempre lo stesso giorno della settimana e ora e si basa sull'ora UTC.Ottieni la ricorrenza successiva del giorno e dell'ora in javascript

Sto tentando di scrivere una funzione generale che, dato un giorno della settimana e un'ora, restituirà un oggetto data che rappresenta quei criteri in futuro.

Esempi:

getNextOccuranceOfUTCDayAndHour(1, 7);

ottenere il prossimo verificarsi di 07:00 il Lunedi. Se oggi è lunedì, 25/05/2015 a mezzanotte UTC, questa funzione dovrebbe restituire un oggetto Date che rappresenta lunedì 6/1/2015 alle 7.00 UTC.

getNextOccuranceOfUTCDayAndHour(3, 13);

ottenere il prossimo verificarsi di 13:00 il Mercoledì. Se oggi è martedì, 26/05/2015 a mezzanotte UTC, questa funzione dovrebbe restituire un oggetto Date che rappresenta mercoledì 27/05/2015 alle 13.00 UTC.

Ho tentato di scrivere una funzione per farlo e ho incluso lo snippet qui sotto, ma sembra funzionare solo per alcune date e non per altre. È incredibilmente inaffidabile. Preferirei non utilizzare Moment.js.

function getNextOccuranceOfUTCDayAndHour(day, hour) { 
 
    d = new Date(); 
 
    d.setDate(d.getUTCDate() + (7 + day - d.getUTCDay()) % 7) 
 
    d.setUTCHours(hour, 0, 0, 0); 
 
    return d; 
 
} 
 

 
function format_seconds(t) { 
 
    var d = Math.floor(t/86400); 
 
    var h = Math.floor(t % 86400/3600); 
 
    var m = Math.floor(t % 3600/60); 
 
    var s = Math.floor(t % 3600 % 60); 
 
    return ((d > 0 ? d + " d. " : "") + 
 
    (h > 0 ? h + " h. " : "") + 
 
    (m > 0 ? m + " m. " : "") + 
 
    s + " s."); 
 
} 
 

 
function update() { 
 
    var next_occurance = getNextOccuranceOfUTCDayAndHour(1, 7); 
 
    $('#next_occurance').text(next_occurance); 
 
    var ms = next_occurance - new Date(); 
 
    $('#countdown').text(format_seconds(Math.floor(ms/1000))); 
 
} 
 

 
$(function() { 
 
    update(); 
 
    setInterval(update, 1000); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p id="next_occurance">Next Occurance</p> 
 
<p id="countdown">Countdown</p>

Edit: Alcuni esempi di vs. previsto restituito valori. JSFiddle

+0

Potrebbe includere alcuni esempi di date che funzionano e quelle che non lo fanno? – Xufox

+1

Certo, ecco qui: https://jsfiddle.net/2j49q0ak/ –

+0

Il secondo esempio restituisce lunedì per me (il mio fuso orario è UTC + 02: 00) ... anche con '.toUTCString()' alla fine di 'return d'. – Xufox

risposta

0

Il problema nel codice originale era l'uso di d.setDate(); anziché d.setUTCDate();. Inoltre, se il giorno corrente era lo stesso giorno della settimana del giorno di destinazione, il risultato non era corretto. Semplicemente aggiungendo un'istruzione if per verificare questo caso risolve il problema.

Aggiornato JSFiddle: https://jsfiddle.net/2j49q0ak/1