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

转自文翼的博客:将本地时间转换为 GMT 时间的更多相关文章

  1. 如何用word文档在博客里发表文章

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  2. 一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等

    本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系.如需转载请说明原处. 第一部分 - 博客/文档系统的搭建 搭建博客有很多选择,平台性的比如: 知名的CSDN, 博客园, 知乎,简 ...

  3. 有道云笔记新功能发现——有道云笔记剪报,完美解决不开会员保存csdn博客到本地的问题。

    怎么用 方法一:谷歌插件 方法二:http://note.youdao.com/web-clipper-chrome.html 添加到书签 功能: 能够把网页浏览的内容保存到有道云笔记 解决了自己的难 ...

  4. Java 开源博客 —— Solo 0.6.9 发布时间!

    Solo 它是 GitHub 上 Star 的最大数量 Java 博客系统,今天,我们宣布 0.6.9 正式版,欢迎来到下载. 特性 基于标签的文章分类 博客/标签 Atom/RSS.Sitemap ...

  5. composer本地安装文档 - CSDN博客

    1.下载下图2个文件 2.将上图2个文件放到php根目录下与php.exe再同一目录 3.在composer.bat写 4.配置环境变量(将php目录复制到环境变量里) 5.将php.ini配置文件的 ...

  6. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    文顶顶iOS开发博客链接整理及部分项目源代码下载   网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...

  7. 用Python编写博客导出工具

    用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处   写在前面的话 我在 github 上用 octopress 搭建了个人博 ...

  8. hexo框架-next主题-github搭建个人博客

    IT`huhui 的前言录 我在GITHUB的个人站点:http://ithuhui.cn 这里遇到的很多问题都是亲身解决后写的.还有遇到不懂可以邮件M我 在这里要感谢浮生志的博客教程,很多我一开始不 ...

  9. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

随机推荐

  1. 小机房的树 codevs 2370

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小机房有棵焕狗种的树 ...

  2. plsqldevloper + orcal环境搭建

    移动信息安全的漏洞和逆向原理      程序员11月书讯,评论得书啦      Get IT技能知识库,50个领域一键直达 关闭 PL/SQL Developer安装配置实践 2014-04-23 1 ...

  3. Java面向对象之接口

    什么是接口:接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合 语法: [修饰符] interface 接口名 extends 父接口1,夫接口2....... class 类名 ext ...

  4. 服务器发布tomcat的WEB项目供外网访问

    1.首先你要确定你有一个外网ip地址.如果你分配到的是一个局域网IP地址需要经过一系列的转换为外网ip地址,然后继续下面操作. 2.拿到外网IP地址,进行tomcat的server.xml文件的配置. ...

  5. java 26 - 8 网络编程之 TCP协议的练习

    TCP练习: 1.客户端键盘录入,服务器输出文本文件 客户端代码: public class ClientDemo { public static void main(String[] args) t ...

  6. box-shadow 的一些使用

    1.只有左侧有阴影 box-shadow: -10px 0px 3px 1px #aaaaaa;

  7. Nginx+keepalived双机热备(主主模式)

    之前已经介绍了Nginx+Keepalived双机热备的主从模式,今天在此基础上说下主主模式的配置. 由之前的配置信息可知:master机器(master-node):103.110.98.14/19 ...

  8. Delphi常用系统函数总结

    Delphi常用系统函数总结 字符串处理函数 Unit System 函数原型 function Concat(s1 [, s2,..., sn]: string): string; 说明 与 S : ...

  9. js jquery 关闭弹出页面 并刷新父页面(window.opener)

    function Closepage() { if (window.opener && !window.opener.closed) { window.parent.opener.lo ...

  10. ORA-06519: active autonomous transaction detected and rolled back

    这个问题一般怎么解决 ?现在忙 待会贴详细代码  先给些路子..给位大大们 引用 楼主 green3365302 的回复: 这个问题一般怎么解决 ?现在忙 待会贴详细代码  先给些路子..给位大大们 ...