Таймер обратного отсчета JS с часами / секундами не работает в Safari - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть таймер обратного отсчета, который отлично работает в Chrome, но не в Safari.Я уже нашел похожие вопросы по SO, но не смог найти решение для меня.

Если я удаляю часы и секунды из метки времени, это также работает в Safari, но мне это нужно с часами / минутами.

  function makeTimer() {
    	datestamp = "2019-09-25 00:00";
        var endTime = new Date(datestamp);
        // var endTime = new Date("2019-09-25 00:00");
          endTime = (Date.parse(endTime) / 1000);

          var now = new Date();
          now = (Date.parse(now) / 1000);

          var timeLeft = endTime - 7200 - now;

          var days = Math.floor(timeLeft / 86400);
          var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
          var hours2 = Math.floor(((timeLeft - (days * 86400)) / 3600) + (days * 24));
          var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
          var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));

          if (hours2 < "0") { hours2 = "00"; minutes = "0"; seconds = "0"; $(".body").addClass("timerOff"); } else if (hours2 < "10") { hours2 = "0" + hours2; }
          if (minutes <= "0") { minutes = "00" } else if (minutes < "10") { minutes = "0" + minutes; }
          if (seconds <= "0") { seconds = "00" } else if (seconds < "10") { seconds = "0" + seconds; }

          $("#hours2").html(hours2);
          $("#minutes").html(minutes);
          $("#seconds").html(seconds);
      }

setInterval(function() { makeTimer(); }, 500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<span id="hours2"></span>h
<span id="minutes"></span>m
<span id="seconds"></span>s

Скрипка

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Согласно MDN :

Строковое значение, представляющее дату, указанную в формате, распознаваемом методом Date.parse () (эти форматы соответствуют IETF-RFC2822 отметки времени, а также строки в версии ISO8601.

Короче говоря, datestamp = "2019-09-25 00:00" - это ваша неправильная точка.Изменение даты на 2019-09-25T00:00:00Z должно исправить это.

1 голос
/ 24 сентября 2019

new Date конструктор с отметкой времени не рекомендуется из-за его несовместимости между браузерами.Цитирование mdn :

Примечание: синтаксический анализ строк даты с помощью конструктора Date (и Date.parse, они эквивалентны) настоятельно не рекомендуется из-за различий и несоответствий в браузере.Поддержка строк формата RFC 2822 предоставляется только по соглашению.Поддержка форматов ISO 8601 отличается тем, что строки только с датой (например, «1970-01-01») обрабатываются как UTC, а не как локальные.

Некоторые браузеры пытаются анализировать дату, даже если онане в стандартном формате.Safari не входит в число этих браузеров.

Чтобы обеспечить совместимость между браузерами, рассмотрите возможность использования moment или анализа строки с помощью пользовательской функции.

momentJs:

moment(datestamp, 'YYYY-MM-DD hh:mm');

Пользовательская функция:

function parseDate(str) {
   return str.match(/(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})/).slice(1, 6);
}
...