博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转自文翼的博客:将本地时间转换为 GMT 时间
阅读量:7223 次
发布时间:2019-06-29

本文共 4251 字,大约阅读时间需要 14 分钟。

在写 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);    }

 

 

转载地址:http://gykfm.baihongyu.com/

你可能感兴趣的文章
JMM-java内存模型
查看>>
iOS的soap应用(webservice) 开发
查看>>
Delphi listview 点击列头排序
查看>>
android preference page
查看>>
mysql索引挑选
查看>>
关于冰岛足球的段子
查看>>
在 Windows 中安装 Laravel 5.1.X
查看>>
TeamViewer 9发布-在Linux下安装运行
查看>>
Centos7 Gitea安装教程 - 一款易搭建,运行快的Git服务器
查看>>
CentOS minimal 网络配置
查看>>
Nginx架构
查看>>
为什么结构体中的数组不能用const int变量指定大小?
查看>>
模板特化疑问
查看>>
ruby多线程理解
查看>>
享用甜点时要不要来杯咖啡?Java 与树莓派 (Raspberry PI)
查看>>
精通Oracle 10g Pl/SQL编程
查看>>
邱怡轩:R中大规模矩阵的SVD与矩阵补全
查看>>
C++ Primer习题集(第5版)
查看>>
centos7 mysql 5.7 yum安装
查看>>
JSOUP简单应用
查看>>