我试图在将来的特定时间点实施倒数计时器.此时间点始终是星期和小时的同一天,并且基于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);
});Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
编辑:预期值与返回值的一些示例.的jsfiddle
原始代码中的问题是使用d.setDate();代替d.setUTCDate();。此外,如果当前日期与目标日期是一周中的同一天,则结果不正确。只需添加一个 if 语句来检查这种情况即可解决该问题。
更新了 JSFiddle:https://jsfiddle.net/2j49q0ak/1