【问题标题】:JS Countdown timer with hours/seconds not working in Safari带有小时/秒的JS倒数计时器在Safari中不起作用
【发布时间】:2019-09-24 08:16:38
【问题描述】:

我有一个倒数计时器,它在 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

Fiddle

【问题讨论】:

  • 在 Safari 中检查控制台看看错误是什么
  • @RoryMcCrossan 我在 Safari 上,实际上没有看到错误。没有调试这个,但没有出现。我不得不说这段代码看起来比必要的复杂一些(Date.parse(now) / 1000?只需使用Date.now() 并跳过一个使事情复杂化的步骤,然后使用毫秒计算,因为无论如何在 JS 中一切都基于毫秒)。 ..
  • @somethinghere 我不是 JS 专业人士,我只是尽力让这个工作:D - 我也没有收到错误,只是看到,Safari 中的倒计时没有运行。如果您可以更改它以使其运行,那就太棒了。

标签: javascript jquery countdown


【解决方案1】:

According to MDN:

表示日期的字符串值,以可识别的格式指定 通过 Date.parse() 方法(这些格式符合 IETF RFC 2822 时间戳和 ISO8601 版本中的字符串)。

简而言之,datestamp = "2019-09-25 00:00" 是您的错误观点。将日期更改为 2019-09-25T00:00:00Z 应该可以解决它。

【讨论】:

    【解决方案2】:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 2015-02-21
      • 1970-01-01
      • 2018-04-10
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多