2016-05-12 2 views
0

Мне нужен простой таймер обратного отсчета, но это действительно подслушивает меня, что я почему-то не могу его получить, и я думаю, что это из-за специального способа, который мне нужен сделано, он должен придерживаться этих правил:Таймер обратного отсчета каждый час, но на 30-минутных отметках

  • должно быть каждый час
  • должно быть на 30-й минуте
  • должны использовать время

UTC Так, например, это 07 : 22 UTC, это будет 8 минут до следующего на е.
Если бы это было так, 07:30, скажем, 1 час до следующего.
И последнее, но не менее важное: если бы это было 07:31, было бы сказано 59 минут до следующего.

Я был в состоянии сделать это очень легко для других обратных отсчетов, которые я сделал, но они были для вещей типа часов, это было не так сложно ... Я просто сильно потрясен, пожалуйста, помогите мне.

EDIT Добавлен образец кода

 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 + "."); 
+1

Звучит как домашнее задание. Каков ваш код до сих пор? –

+0

Это не домашнее задание, это для моего хобби моего проекта, позвольте мне добавить snip кода, который работает каждые 3 часа в час – unlucky4ever

+0

Мои часы запущены. 18:52 до следующей отметки в 30 минут. Давай, покажи свой код. –

ответ

1

Давайте делать какие-то мысли. Мы хотим знать, когда минутная стрелка в следующий раз показывает 30. Если бы мы хотели знать только каждые полчаса, мы могли бы просто взять оставшуюся часть на 30, как вы делали с d.getUTCHours() % 3.

Однако мы хотим получить каждые 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> 
1

Может быть, я что-то, но, насколько я могу видеть, UTC и в самом деле часы вообще не имеют отношения к этому не хватает. Это должно быть так просто, как просто рассчитать, где текущая минута.

Может быть что-то вроде

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

Прекрасно, большое вам спасибо, трудно поверить в то, что так просто было так сложно для меня. – unlucky4ever