转自文翼的博客:将本地时间转换为 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); }
 
    越努力,越幸运,坚持每天学习一小时,坚持每天吸收一个知识点。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号