倒数计时器每小时但30分钟标记

时间:2016-05-12 07:19:36

标签: javascript timer countdown

我需要一个简单的倒数计时器,但它真的让我感到烦恼,因为我出于某些原因似乎无法得到它,而且我认为这是因为我需要它的特殊方式,它必须遵守这些规则:

  • 必须每小时
  • 必须在30分钟标记
  • 必须使用UTC时间

例如,它是UTC时间07:22,直到下一个是8分钟 如果说是07:30,那就说1小时到下一个 最后但并非最不重要的是,如果它是07:31,它会说59分钟直到下一个。

我能够非常轻松地完成我所做的其他倒计时,但那些是针对小时类型的事情,这不是很复杂......我只是很难过,请帮助我。

修改 添加了示例代码

        var d = new Date();
        var hoursUntil = 2 - d.getUTCHours() % 3;
        var minutesUntil = 60 - d.getUTCMinutes();

        var timestr = "";

        if (minutesUntil === 60) {
            hoursUntil++;
            minutesUntil = 0;
        }

        if (hoursUntil > 0) {
            timestr += hoursUntil + " hour" + (hoursUntil > 1 ? "s" : "");
        }

        if (hoursUntil >= 1 && minutesUntil > 1) {
            timestr += " and " + minutesUntil + " minute" + (minutesUntil > 1 ? "s" : "");
        }

        if (minutesUntil > 1 && hoursUntil < 1) {
            timestr += minutesUntil + " minute" + (minutesUntil > 0 && minutesUntil < 2 ? "" : "s");
        }

        bot.sendMessage(msg, "Next event will be in " + timestr + ".");

2 个答案:

答案 0 :(得分:1)

也许我错过了一些东西,但据我所知,UTC和实际上一般的时间与此无关。它应该只是计算当前分钟的位置。

也许像

now = new Date();
minutes = now.getMinutes();
if(minutes > 30) {
    minutes_until = (60 - minutes) + 30;
    }
else {
    minutes_until = 30 - minutes;
    }

答案 1 :(得分:1)

让我们做一些想法。我们想知道的是,当下一分钟的分针显示为30时。如果我们只想知道每半小时,我们就可以像对待d.getUTCHours() % 3那样将剩余的除法除以30。

但是,我们希望每60分钟一次,所以我们做somethingInMinutes % 60。标记必须从60变为0,所以只需添加30分钟。

要获得秒精度,请将其计算为秒,添加当前秒数并从60分钟(3600秒)减去。

我们想要一个每隔一个班次触发的计时器。计算1000和毫秒的差值。

<div>Seconds remaining until next 30 minutes mark: <span id="min-total"></span></div>
<div>minutes:seconds remaining: <span id="min-part"></span>:<span id="sec-part"></span></div>

<script>
  var byId = document.getElementById.bind(document);

  function updateTime()
  {
    var
      time = new Date(),
      // take 1800 seconds (30 minutes) and substract the remaining minutes and seconds
      // 30 minutes mark is rest of (+30 divided by 60); *60 in seconds; substract both, mins & secs
      secsRemaining = 3600 - (time.getUTCMinutes()+30)%60 * 60 - time.getUTCSeconds(),
      // integer division
      mins = Math.floor(secsRemaining / 60),
      secs = secsRemaining % 60
    ;
    byId('min-total').textContent = secsRemaining;
    byId('min-part').textContent  = mins;
    byId('sec-part').textContent  = secs;

    // let's be sophisticated and get a fresh time object
    // to calculate the next seconds shift of the clock
    setTimeout( updateTime, 1000 - (new Date()).getUTCMilliseconds() );
  }
  updateTime();
</script>