关于本地时间,过期时间,倒计时,时区

发布于 2019-12-28  58 次阅读


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);  //定时调用

凡心所向,素履所往