当前位置: 首页 > 编程笔记 >

js前端如何写一个精确的倒计时代码

宇文和昶
2023-03-14
本文向大家介绍js前端如何写一个精确的倒计时代码,包括了js前端如何写一个精确的倒计时代码的使用技巧和注意事项,需要的朋友参考一下

关于写倒计时大家可能都都比较熟悉,使用 setTimeout 或 setInterval 就可以搞定。几秒钟或者几分钟的倒计时这样写没有问题,但是如果是长时间的倒计时,这样写就会不准确。如果用户修改了他的设备时间,这样的倒计时就没有意义了。今天就说说写一个精确的倒计时的方法。

原理

众所周知 setTimeout 或者 setInterval 调用的时候会有微小的误差。有人做了一个 demo 来观察这个现象并对其做了修正。短时间的误差倒也可以接受,但是作为一个长时间的倒计时,误差累计就会导致倒计时不准确。

因此我们可以在获取剩余时间的时候,每次 new 一个设备时间,因为设备时间的流逝相对是准确的,并且如果设备打开了网络时间同步,也会解决这个问题。

但是,如果用户修改了设备时间,那么整个倒计时就没有意义了,用户只要将设备时间修改为倒计时的 endTime 就可以轻易看到倒计时结束是页面的变化。因此一开始获取服务端时间就是很重要的。

简单的说,一个简单的精确倒计时原理如下:

  • 初始化时请求一次服务器时间 serverTime,再 new 一个设备时间 deviceTime
  • deviceTime 与 serverTime 的差作为时间偏移修正
  • 每次递归时 new 一个系统时间,解决 setTimeout 不准确的问题

代码

获取剩余时间的代码如下:

/**
 * 获取剩余时间
 * @param {Number} endTime  截止时间
 * @param {Number} deviceTime 设备时间
 * @param {Number} serverTime 服务端时间
 * @return {Object}      剩余时间对象
 */
let getRemainTime = (endTime, deviceTime, serverTime) => {
  let t = endTime - Date.parse(new Date()) - serverTime + deviceTime
  let seconds = Math.floor((t / 1000) % 60)
  let minutes = Math.floor((t / 1000 / 60) % 60)
  let hours = Math.floor((t / (1000 * 60 * 60)) % 24)
  let days = Math.floor(t / (1000 * 60 * 60 * 24))
  return {
    'total': t,
    'days': days,
    'hours': hours,
    'minutes': minutes,
    'seconds': seconds
  }
}

获取服务器时间可以使用 mtop 接口 mtop.common.getTimestamp

然后可以通过下面的方式来使用:

// 获取服务端时间(获取服务端时间代码略)
getServerTime((serverTime) => {

  //设置定时器
  let intervalTimer = setInterval(() => {

    // 得到剩余时间
    let remainTime = getRemainTime(endTime, deviceTime, serverTime)

    // 倒计时到两个小时内
    if (remainTime.total <= 7200000 && remainTime.total > 0) {
      // do something

    //倒计时结束
    } else if (remainTime.total <= 0) {
      clearInterval(intervalTimer);
      // do something
    }
  }, 1000)
})

这样的的写法也可以做到准确倒计时,同时也比较简洁。不需要隔段时间再去同步一次服务端时间。

补充

在写倒计时的时候遇到了一个坑这里记录一下。

千万别在倒计时结束的时候请求接口。会让服务端瞬间 QPS 峰值达到非常高。

如果在倒计时结束的时候要使用新的数据渲染页面,正确的做法是:

在倒计时结束前的一段时间里,先请求好数据,倒计时结束后,再渲染页面。

关于倒计时,如果你有什么更好的解决方案,欢迎评论交流。

 类似资料:
  • 本文向大家介绍js精准的倒计时函数分享,包括了js精准的倒计时函数分享的使用技巧和注意事项,需要的朋友参考一下 先看看倒计时效果:   代码: 注意点:  1.有两个功能:当前时间和倒计时,带的参数不同  2.主要是利用js返回的数据,要注意月份,某天,小时,分钟,返回的数值区间  3.星期的我这边用数组处理了  4.倒计时主要是计算时间差,结束时间减去当前时间的秒数,在进行数学计算  5.这里用

  • 本文向大家介绍JS倒计时代码汇总,包括了JS倒计时代码汇总的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了常见的JS倒计时代码。分享给大家供大家参考。具体汇总如下: 第一种:精确到秒的javascript倒计时代码  HTML代码:  第二种:某某运动会  HTML代码:    第三种:小时倒计时  HTML代码:  第四种:最简倒计时  HTML代码:  第五种:最简倒计时二  HTML

  • 本文向大家介绍javascript实现倒计时(精确到秒),包括了javascript实现倒计时(精确到秒)的使用技巧和注意事项,需要的朋友参考一下 代码相当简单实用,这里就不多废话了,小伙伴们简单看下就能明白 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 后台给了startTime和endTime的时间戳,通过他俩的差写一个倒计时,求解

  • 本文向大家介绍简单易用的倒计时js代码,包括了简单易用的倒计时js代码的使用技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍js实现倒计时关键代码,包括了js实现倒计时关键代码的使用技巧和注意事项,需要的朋友参考一下 我们经常会在一些电商网站上看到秒杀倒计时,双11倒计时.其实倒计时的效果实现起来也是很简单的,并不复杂. 首先呢,开始写之前一定要理清楚思路,思路清晰了,那写起来就容易多了,下面我分了几个步骤: 1.获取当前的时间,并且定义结束的时间 2.用求未来时间和当前时间的时间差,并且求出时分秒 3.