1.# 时间问题
参考:https://juejin.im/post/5d23ef766fb9a07ea5681378
https://blog.csdn.net/halfclear/article/details/77573956
• 链接1-- java中时间戳无时区信息,但变为Date类型打印出来会带有时区信息,所以下发的时间戳与时区无关,但下发Date类型会带上东8区时区信息
• 链接2【关于时间js介绍】--下发的 2019-07-11 11:00:00在safari等会报错,要转为2019/07/11 11:00:00格式
1.1.1. 服务器与本地时间
• 取服务端下发的字符戳,与本地时间计算出差值,在倒计时时推出服务器当前时间 --切换时间,本地时间不等于服务器时间
this.timeOffset = (+new Date() - serverTime) || 0;
const currentTime = +new Date() - this.timeOffset
1.2.2. 切时区问题
getTimezoneOffset方法
• 怎么得到不同时区时间
var dateLocal = new Date();
var date1 = new Date('August 19, 1975 23:15:30 GMT+07:00');
var date2 = new Date('August 19, 1975 23:15:30 GMT-02:00');
console.log(dateLocal.getTimezoneOffset());
console.log(date1.getTimezoneOffset());
console.log(date2.getTimezoneOffset());
// -480
// -480
// -480
getTimezoneOffset()方法返回的结果,是当前地方时和UTC时间的差值,用分钟表示
dateLocal 可以理解为,( 0时区 - 本地时区(+8) ) * 60min = -480.
1.3.3. 怎么处理倒计时与展示过期时间
new Date()为本地时间(所在时区),现在时间=服务器东八区时间,过期时间=服务器东八区过期时间
/** 服务器下发时间戳(本时区时间)expiretime,timestamp(服务器时间)--均为不带时区信息
Date.now()--本时区时间
Date.now()-timestamp 为与服务器时间差
expiretime展示时需要转化为东8区时间 **/
//过期时间
function getTimezoneOffset(serverTimeStamp) {
return (new Date(serverTimeStamp).getTimezoneOffset() + 480) * 6e4;
};
const expiretimeZone = getTimezoneOffset(expiretime);//再用过期时间得到年月日
//倒计时,需要剩余时间差值
const timeoffset = (+new Date() - timestamp) || 0;
//展示时分秒格式
function detailDataTranform(expireTime, timeOffset) {
const dateTimestamp = Date.now() - timeOffset;
const remainTimestamp = +expireTime - dateTimestamp;
let hours = Math.floor(remainTimestamp / (1000 * 60 * 60) % 24);
hours = hours < 10 ? ('0' + hours).slice(-2) : hours;
const minutes = ('0' + Math.floor(remainTimestamp / (1000 * 60) % 60)).slice(-2);
const seconds = ('0' + Math.floor(remainTimestamp / 1000) % 60).slice(-2);
return hours + ':' + minutes + ':' + seconds;
}
detailDataTranform(expireTime,timeoffset);//定时调用
/** 服务器下发时间戳(本时区时间)expireDate(东8区时区),timestamp(服务器时间)为不带时区信息
Date.now()--本时区时间
Date.now()-timestamp 为与服务器时间差
expireDate展示时不需要转化为东8区时间 **/
//过期时间
expireDate//直接展示或照要求换一下格式
//倒计时,需要剩余时间差值
/**
* 将东8区时间转为本时区时间戳
* @param {*} expireDate
*/
function transformExpireDate(expireDate) {
const expireTime = Date.parse(expireDate.replace(/-/g, '/'));//解析为字符戳
const timezoneOffset = (new Date().getTimezoneOffset() + 480) * 6e4;//getTimezoneOffset方法返回协调世界时(UTC)相对于当前时区的时间差值,单位为分,再换算为东八区偏差值
return expireTime - timezoneOffset;//该时区的时间值+与东8区偏差值=东8区时间,得到不带时区的时间戳
}
//展示时分秒格式
function detailDataTranform(expireTime, timeOffset) {
const dateTimestamp = Date.now() - timeOffset;
const remainTimestamp = +expireTime - dateTimestamp;
let hours = Math.floor(remainTimestamp / (1000 * 60 * 60) % 24);
hours = hours < 10 ? ('0' + hours).slice(-2) : hours;
const minutes = ('0' + Math.floor(remainTimestamp / (1000 * 60) % 60)).slice(-2);
const seconds = ('0' + Math.floor(remainTimestamp / 1000) % 60).slice(-2);
return hours + ':' + minutes + ':' + seconds;
}
const timeoffset = (+new Date() - timestamp) || 0;
const expireTime = transformExpireDate(expireDate);
detailDataTranform(expireTime,timeoffset); //定时调用
Comments | NOTHING