1、需求背景:
已知北京时间和北京时区GMT+8,需要算出目标国家所在时区的时间,并且时间是每1s前进1s。实时更新
2、思路:
先获取服务器时间,然后把服务器的时间在本地进行实时更新,而不是每1s获取一次服务器时间,服务器时间转为时间戳,用定时器每1s加1000ms,计算出来的变量,是当前服务器时间在本地上的实时更新。然后再用这个变量通过计算,算出来目标国家所在区时的时间。
目标国家所在区时的思路:当前北京时间减去8小时,算出GMT=0的时候的标准时间,然后再根据目标国家所在时区,进行再次加减。为了方便时间运算,需要把获取的北京的服务器时间转化为时间戳。再进行60x60x1000(1h=60m 1m=60s 1s=1000ms)。
转化为时间戳的方法:
formatTime(ts){
let year = ts.getFullYear();
let month = ts.getMonth() + 1;
month = month < 10 ? ('0' + month) : month;
let date = ts.getDate();
date = date < 10 ? ('0' + date) : date;
let hours = ts.getHours();
hours = hours < 10 ? ('0' + hours) : hours;
let minute = ts.getMinutes();
minute = minute < 10 ? ('0' + minute) : minute;
let second = ts.getSeconds();
second = second < 10 ? ('0' + second) : second;
return year + '-' + month + '-' + date + ' ' + hours + ':' + minute + ':' + second
},
3、代码展示
1)获取服务器时间
methods:{
async getTime() {
this.serverTime = await getServerTime()
},
}
2)把服务器时间,加上定时器,在本地实时更新
mounted() {
this.getTime()
this.timer = setInterval(()=>{
this.serverTime = new Date(this.serverTime.getTime() + 1000)
console.log(this.serverTime.getTime());
},1000)
}
这里面this.serverTime.getTime已经把获取来的服务器时间转化为时间戳
3)转化运算:把不断变化的时间戳运算转化为目标国家所在的时区
computed:{
regionalTime(){
if (this.serverTime) {
if (!this.timeZone) {
return this.formatTime(this.serverTime)
}
return this.formatTime(new Date(this.serverTime.getTime() - 8 * 3600000 + (this.timeZone.substring(3,5)) * 3600000));
}
return null
},
}
4)清除定时器
destroyed(){
if (this.timer) {
clearInterval(this.timer)
}
},