我正在尝试在将来的特定时间点实施倒数计时器。此时间点始终是星期和小时的同一天,并且基于UTC时间。
我正在尝试编写一个通用函数,该函数给出一周中的某一天和一小时,它将返回一个代表该条件的日期对象。
示例:
getNextOccuranceOfUTCDayAndHour(1, 7);
周一早上7点到达。如果今天是星期一,2015年5月25日@午夜UTC,那么此函数应该返回一个Date对象,表示2015年1月6日星期一上午7点UTC。
getNextOccuranceOfUTCDayAndHour(3, 13);
星期三下午1点到达。如果今天是2015年5月26日星期二@午夜UTC,那么此函数应该返回一个Date对象,表示2015年5月27日星期三下午1点UTC。
我曾尝试编写一个函数来执行此操作,并且我已将下面的代码段包含在内,但它似乎只适用于某些日期而非其他日期。这是非常不可靠的。我宁愿不使用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>
编辑:预期与返回值的一些示例。 JSFiddle
答案 0 :(得分:0)
原始代码中的问题是使用d.setDate();
而不是d.setUTCDate();
。此外,如果当天是与目标日相同的一周,则结果不正确。只需添加一个if语句来检查这个案例就可以解决这个问题。
更新了JSFiddle:https://jsfiddle.net/2j49q0ak/1