在写 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. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  2. ArrayList如何保证线程安全

    ArrayList是线程不安全的,轻量级的.如何使ArrayList线程安全? 1.继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchro ...

  3. 游戏/APP的多语言系统设计

    多语言需求 游戏或者APP中可以根据不同地区显示不同语言,那么这是怎么实现的呢?要如何处理应用中的图片呢? 思路分析 系统设计 字体翻译显示 多语言收集工具 图例解释 把界面上出现的文字,翻译到多语言 ...

  4. JavaScript作用域闭包简述

    JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...

  5. SQL连接查询

    连接查询:通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 常用的两个链接运算符: 1.join   on 2.union 在关系数据库 ...

  6. 常用Meta整理

    标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他web 服务. ——W3School 必要属性 ...

  7. Stunnel服务端

    Stunnel on Debian GNU/Linux 6 (squeeze) 传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访 ...

  8. <转>SQL语句大全

    本文为转载,原文地址:http://www.cnblogs.com/cangqiongbingchen/p/4530333.html 一.基  础 1.说明:创建数据库CREATE DATABASE ...

  9. 一种Docker image镜像的取代方案

    在http://openvz.org/Download/templates/precreated中有很多压缩的镜像文件,可以将这些文件下载后采用import方式使用镜像,也可以采用我原来的博文:doc ...

  10. php加载xml编码错误,“Error: Input is not proper UTF-8, indicate encoding! ”

    最近在给php中解析xml的时候,抛出一个错误: "Warning: DOMDocument::load(): Input is not proper UTF-8, indicate enc ...