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

时间:2015-05-26 02:45:12

标签: 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);
});
<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

1 个答案:

答案 0 :(得分:0)

原始代码中的问题是使用d.setDate();而不是d.setUTCDate();。此外,如果当天是与目标日相同的一周,则结果不正确。只需添加一个if语句来检查这个案例就可以解决这个问题。

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