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);
        }
     
  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/baiyygynui/p/5768403.html
Copyright © 2011-2022 走看看