zoukankan      html  css  js  c++  java
  • 转自文翼的博客:将本地时间转换为 GMT 时间

    在写 RSS 订阅接口的时候,发现最终输出文章的 RSS 时间(GMT时间),在本地上显示的时间和在服务器上显示的时间不一致。 原因是时区不一致,那么在 JavaScript 中,如何将时间转换为统一的时间呢?

    1. 查看本地和服务器的时区

    通过 date 命令,可以知道:

    • 本地的时区是:GMT+0800 (CST)
    • 服务器的时区是:GMT+0400 (MSK)

    首先,需要明确的一点是,文章上的时间是基于本地时间的,也就是说是 GMT+0800 (CST)。

    2. 代码调试

    便于理解,我们来举个栗子,例如文章的时间为 2013-11-05 00:00:00, 那么我们最终想要的时间是 2013-11-04 16:00:00 GMT

    在本机上

    var date = new Date('2013-11-05 00:00:00'); // Tue Nov 05 2013 00:00:00 GMT+0800 (CST)
    date.toGMTString(); // Mon, 04 Nov 2013 16:00:00 GMT
    

    在服务器上:

    var date = new Date('2013-11-05 00:00:00'); // Tue Nov 05 2013 00:00:00 GMT+0400 (MSK)
    date.toGMTString(); // Mon, 04 Nov 2013 20:00:00 GMT
    

    通过对比可以看到,在服务器上也把需要转换的时间当初是本地时间了,所以导致了最终转换的 GMT 时间不一致。

    3. 如何解决

    Date 对象中有 getTimezoneOffset() 方法,返回的是本地时间与 GMT 时间或 UTC 时间之间相差的分钟数。

    var date = new Date('2013-11-05 00:00:00'); // Tue Nov 05 2013 00:00:00 GMT+0400 (MSK)
    
    var localTime = date.getTime() - 8 * 3600000 - date.getTimezoneOffset() * 60000; // 先将文章的时间转换为服务器的本地时间 
    
    var newDate = new Date(localTime); // Mon Nov 04 2013 20:00:00 GMT+0400 (MSK)
    
    newDate.toGMTString(); // Mon, 04 Nov 2013 16:00:00 GMT
    

    可以看到,在服务器上也得到我们想要的结果了。

    4. 最终成果

    function getGMTString(time, localTimezone) {
        var date = new Date(time);
        return new Date(date.getTime() - localTime * 3600000 - 
            date.getTimezoneOffset() * 60000).toGMTString(); 
    }


    通过上面的方法,我将本地获取到的时间转换为北京时区并传给后台:
    //切换成北京时区格式
        setTimeEnd(date){
            let localTime = date.getTime() -8 * 3600000 - date.getTimezoneOffset() * 60000;
            this.props.setEndTimeIos(localTime);
            //this.props.BJTime(date);
            console.log("465454" + localTime);
        }

    action中的setEndTimeIos方法,把已经转换成北京时区的时间格式保存在getState()中,方便使用:

    /**
     * 结束时间
     */
    export function setEndTimeIos(date){
        let endTimes = date;
        return{
            type: SET_END_TIME,
            data: {endTimes}
        }
    }

    最后通过时间组件,把默认时间与选择后的时间,分别传入:

    return (dispatch,getState) => {
    
            let date = new Date();
            let defaultDate;
            let year =  date.getFullYear();
            let month = date.getMonth() + 1;
            let day =  date.getDate();
            let hour = date.getHours();
            let minute = date.getMinutes();
            let second = date.getSeconds();
            month = month < 10 ? "0" + month : month;
            day = day < 10 ? "0" + day : day;
            hour = hour < 10 ? "0" + hour : hour;
            minute = minute < 10 ? "0" + minute : minute;
            second = second < 10 ? "0" + second : second;
          //默认时间
            defaultDate =  year + "-" + month + "-" + day + "  " + hour + ":" + minute + ":" + second;
          
    
    
    
            let advertisement = advertisementList;
            let str = JSON.stringify(advertisement);
            let appConfigVersionId = 'iOSTestConfigVersion';
            let appId = 'jia-jian-rest';
    
    
            let AppConfigEntity = {};
            let stateOne = getState().applicationState;
            let stateTwo = getState().iosAndroidState;
          //选择后的时间
            let dateStart =  stateTwo.startTimes ? stateTwo.startTimes : defaultDate;
            let dateEnd = stateTwo.endTimes ? stateTwo.endTimes : defaultDate;
    
    
            AppConfigEntity.configEntityJson = str;
            AppConfigEntity.configDescription = stateTwo.configDescription;
            AppConfigEntity.startTime = dateStart;
            AppConfigEntity.endTime = dateEnd;
            AppConfigEntity.appConfigVersionId = appConfigVersionId;
    
    
            Api.addIosImgList(AppConfigEntity,appId,params =>{
                dispatch(iosImgCongSetter(params)) ;
            });
        }

     如果获取到的是一个时间戳:1469980800000(北京时区),怎么将它正确转换成 20016-08-24 13:82:26

    formatDate(now){
            let year = now.getFullYear();
            let month = now.getMonth() + 1;
            let day = now.getDay();
            let hour = now.getHours();
            let minute = now.getMinutes();
            let second = now.getSeconds();
            
            month = month < 10 ? "0" + month : month;
            day = day < 10 ? "0" + day : day;
            hour = hour < 10 ? "0" + hour : hour;
            minute = minute < 10 ? "0" + minute : minute;
            second = second < 10 ? "0" + second : second;
    
            return year + "-" + month + "-" + day + "  " + hour + ":" + minute + ":" + second;
        }
    
    formatTime(cell,row){
            let currTime = row.createdOn;    //1469980800000
            let date = new Date(currTime);
    
            let currentTime = this.formatDate(date);
            return currentTime;            //2016-07-03 20:16:20
    
            console.log("格式化后的日期格式为:" + currentTime);
        }
     
  • 相关阅读:
    C# WebApi 获取客户端ip地址
    C# 构造函数快捷键
    2 .SHELL 5~10节
    Spring项目集成apidoc生成api接口文档
    根据域名查找对应的ip及端口
    高质量SQL的30条建议
    1 .shell编程1~5
    CentOS7安装mysql8
    编译安Apache2.4.43报错checking for APR... no configure: error: APR not found. Please read the documentation.
    rm -rf * 的正确用法
  • 原文地址:https://www.cnblogs.com/baiyygynui/p/5768403.html
Copyright © 2011-2022 走看看