转自文翼的博客:将本地时间转换为 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);
    }
 
原文地址:https://www.cnblogs.com/baiyygynui/p/5768403.html