在javascript中获取下一个日期和小时

Ste*_*ong 6 javascript date

我试图在将来的特定时间点实施倒数计时器.此时间点始终是星期和小时的同一天,并且基于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

Ste*_*ong 0

原始代码中的问题是使用d.setDate();代替d.setUTCDate();。此外,如果当前日期与目标日期是一周中的同一天,则结果不正确。只需添加一个 if 语句来检查这种情况即可解决该问题。

更新了 JSFiddle:https://jsfiddle.net/2j49q0ak/1