Vue

js获取服务器时间,实现抢购倒计时

2020-12-03  本文已影响0人  候鸟与暖风

商品抢购倒计时,涉及到一个问题,就是时间的准确性,如果使用本地手机或者电脑的时间,就会存在时间不准以及误差,并且还有时区问题

解决方法:使用服务器的时间

困难:但是我们不能每秒钟请求一次服务器,这肯定是不可取的,访问量大了之后服务会崩溃的
我的思路是这样的: 发送ajax请求,从请求头获取服务器时间,然后和本地时间进行对比,计算两者之差,然后让本地之间加上时间差,就是准确的时间了

1.当我们发送ajax请求的时候,可以在ajax响应头中读取到服务器时间(这就不用后台专门写个接口返回给我们前端了)
image.png
2.获取服务器时间

因为我的项目中使用了Vuex,所以我直接设置了一个全局的方法来保存服务器时间


image.png

在Vuex中计算时间差,我使用了moment.js插件

//vuex获取服务器时间  并计算差 
state:{
    serveTime: moment(new Date()),
    differTime: 0, //手机和服务器时间之差
},
mutations:{
    setServiceTime(state, data) { 
        let phoneTime = moment()   //手机/浏览器 当前时间
        state.serveTime = moment(data) //服务器时间
        state.differTime = state.serveTime.diff(phoneTime , 'seconds') //当前时间和服务器时间之差
   }
}

4.在商品倒计时页面处理时间
//页面部分
<template>
  <div>距离活动开始时间还剩 {{waitTime}} </div>
</template>
  
//js部分
  data(){
    return {
      currentTime:moment(),//当前时间
      startTime:'2020-12-30 15:51:00' //活动开始时间
       waitTime:'' //活动倒计时时间
    }
  },
  computed:{
        surplusTime() { //服务器和本地时间之差
            return this.$store.state.differTime
        }
  },
  mounted(){
      this.initTime()
  },
  methods:{
   // 时间计时器
    initTime(){
      this.getNowTime()
       this.timer = setInterval(()=>{
           this.getNowTime()
        },1000)
     },
   // 获取当前时间
    getNowTime() {
        let nowSeconds = moment().unix() * 1000  //把当前时间转化为秒
           //真实时间 = 当前本地时间 + (服务器时间-当前时间只差)
        this. currentTime= moment(nowSeconds).add(this.surplusTime,'seconds').format('YYYY-MM-DD HH:mm:ss')
     },
   // 抢购开始时间倒计时
    computedTime(){
         let du = moment.duration(moment(this.startTime) - moment(this.currentTime), 'ms'), //距离开始抢购剩余时分秒
             hours = du.get('hours'),
             mins = du.get('minutes'),
              ss = du.get('seconds');
         this.waitTime = PrefixInteger(hours, 2) + ':' + PrefixInteger(mins, 2) + ':' + PrefixInteger(ss, 2)
    },
   //时间缺0 补0
    PrefixInteger(){
       return (Array(n).join(0) + num).slice(-n);
    }
  }

以上就是我的解决思路,如果大家有更好的思路,欢迎评论区留言,让大家一起学习,一起进步

上一篇下一篇

猜你喜欢

热点阅读