2015-05-26 10 views
6

Gelecekte belirli bir noktaya bir geri sayım sayacı uygulamak için çalışıyorum. Zaman içinde bu nokta, her zaman haftanın ve saatin aynı günüdür ve UTC zamanına dayanır.javascript

Haftanın bir günü ve bir saati verilen genel bir işlev yazmayı deniyorum, ileride bu ölçütleri temsil eden bir tarih nesnesi döndürecektir.

Örnekler:

getNextOccuranceOfUTCDayAndHour(1, 7);

Pazartesi günü sabah 7 sonraki örneğini alın. Bugün pazartesi, 5/25/2015 @ geceyarısı UTC ise, bu işlev 6/1/2015 Pazartesi saat 7 UTC'yi temsil eden bir Tarih nesnesi döndürmelidir.

getNextOccuranceOfUTCDayAndHour(3, 13);

Çarşamba günü 1 pm sonraki örneğini alın. Bugün salı, 5/26/2015 @ gece yarısı UTC ise, bu işlev, Çarşamba 5/27/2015 1 pm UTC'yi temsil eden bir Tarih nesnesi döndürmelidir.

Bunu yapmak için bir işlev yazmayı denedim ve aşağıdaki pasajı ekledim, ancak yalnızca bazı tarihler için değil, başkaları için çalışıyor gibi görünüyor. İnanılmaz derecede güvenilmez. Moment.js'yi kullanmamayı tercih ederim.

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>

Düzenleme: beklenen vs. ait bazı örnekler değerleri döndü. JSFiddle

+0

birkaç işi tarihleri ​​örneklerini yaramayanlara olanları içerir Could:

JSFiddle Güncelleme? – Xufox

+1

Elbette, işte gidiyorsunuz: https://jsfiddle.net/2j49q0ak/ –

+0

İkinci örnek, geri dönüşün sonunda '.toUTCString()' ile bile benim için Pazartesi'yi döndürür (saat dilimim UTC + 02: 00)… d'. – Xufox

cevap

0

orijinal kodda sorun d.setDate(); yerine d.setUTCDate(); kullanımı oldu. Ayrıca, eğer geçerli gün, hedef gün olarak haftanın aynı günü ise, sonuç yanlıştı. Sadece bu durumu kontrol etmek için bir if ifadesi eklemek, bu sorunu giderir. https://jsfiddle.net/2j49q0ak/1