热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js设置北京时区_如何使不同时区的时间与京8区一致?(JS实现)

如何使不同时区的时间与京8区一致?(JS实现)Update:2019128更简单的是使用这个函数(toDate):自定义日期格式如下(年月

如何使不同时区的时间与京8区一致?(JS实现)

Update:2019/1/28

更简单的是使用这个函数(toDate):

// 自定义日期格式如下(年月日都必须提供):

// "2011-11-11"

// "2011-11-11 11:11"

// "2011-11-11 11:11:11"

const re_custom = /^(\d{4})-(\d{2})-(\d{2})(?: (\d{2}):(\d{2})(?::(\d{2}))?)?$/;

// iso8601日期格式见:

// http://www.ecma-international.org/ecma-262/5.1/#sec-15.9

const re_iso8601 = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?T(?:(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?)?Z?$/;

const _toString = Object.prototype.toString;

// instanceof Date在跨frame和cypress测试上返回false

function isDate(o) {

return _toString.call(o) === '[object Date]';

}

function toDate(input) {

if (!input) {

return new Date();

} else if (isDate(input)) {

return new Date(input);

} else if (typeof input === 'number') {

return new Date(input);

} else if (typeof input === 'string'){

// 如果是自定义的格式,则用本地时间,

// 否则,使用原生的构造方法(本地还是UTC看具体实现)。

let r = re_custom.exec(input);

if (r) {

return new Date(~~r[1], ~~r[2]-1, ~~r[3], ~~r[4], ~~r[5], ~~r[6]);

}

r = re_iso8601.exec(input);

if (r) {

// month/date缺省值为1月/1日

let month = ~~r[2] - 1;

if (month <0) month &#61; 0;

let date &#61; ~~r[3];

if (date &#61;&#61;&#61; 0) date &#61; 1;

return new Date(Date.UTC(~~r[1], month, date, ~~r[4], ~~r[5], ~~r[6], ~~r[7]));

}

return new Date(input);

}

}

----------------------------分割线-------------------------------

一般而言&#xff0c;我们都以时间戳的方式存储某个时间。在需要的时候提取出来&#xff0c;根据不同业务需求进行转化&#xff1a;

function transfromDate(time) {

// 假设time是时间戳&#xff0c;如&#xff1a;1514273945276

let curDate &#61; new Data(time);

// todo

}

这里存在一个潜在问题——改变本机的时区&#xff0c;curDate的值会发生变化&#xff01;shit&#xff01;&#xff01;&#xff01;

当Date作为构造函数调用并传入多个参数时&#xff0c;所定义参数代表的是当地时间

MDN

即&#xff0c;构造出的日期用来显示时&#xff0c;会被转换为本地时间(调用 toString 方法)&#xff1a;

>new Date()

GMT AND UTC

GMT&#43;0800是个什么东西呢&#xff1f;我们先来介绍一些可能当年在地理课上学习过的基本概念。

以前人们通过观察太阳的位置来决定时间(比如&#xff1a;使用日晷)&#xff0c;这就使得不同经纬度的地区时间是不一样的。后来人们进一步规定以子午线为中心&#xff0c;向东西两侧延伸&#xff0c;每 15 度划分一个时区&#xff0c;刚好是 24 个时区。然后因为一天有 24 小时&#xff0c;地球自转一圈是 360 度&#xff0c;360 度 / 24 小时 &#61; 15 度/小时&#xff0c;所以每差一个时区&#xff0c;时间就差一个小时。

GMT&#xff1a;

最开始的标准时间(子午线中心处的时间)是英国伦敦的皇家格林威治天文台的标准时间(因为它刚好在本初子午线经过的地方)&#xff0c;这就是我们常说的 GMT(Greenwich Mean Time)。

然后其他各个时区根据标准时间确定自己的时间&#xff0c;往东的时区时间早(表示为 GMT&#43;hh:mm)、往西的时区时间晚(表示为 GMT-hh:mm)。比如&#xff0c;中国标准时间是东八区&#xff0c;我们的时间就总是比 GMT 时间早 8 小时&#xff0c;他们在早晨 9 点&#xff0c;我们才凌晨 1 点。

所以&#xff0c;GMT&#43;0800 表示早于格林威治时间8小时。

UTC&#xff1a;

但是GMT其实是根据地球自转、公转计算的(太阳每天经过英国伦敦皇家格林威治天文台的时间为中午 12 点)&#xff0c;不是非常准确&#xff0c;于是后面提出了根据原子钟计算的标准时间 UTC(Coordinated Universal Time)。

一般情况下&#xff0c;GMT 和 UTC 可以互换&#xff0c;但是实际上&#xff0c;GMT 是一个时区&#xff0c;而 UTC 是一个时间标准。

JS使不同时区的时间与京8区一致

要计算不同时区相对于京8区的时间偏差&#xff0c;我们要借助 Javascript 中的 Date 对象的实例方法 getTimezoneOffset():

getTimezoneOffset() 方法返回协调世界时(UTC)相对于当前时区的时间差值&#xff0c;单位为分钟。

如果本地时区早于协调世界时(UTC)&#xff0c;则该差值为负值&#xff0c;如果晚于协调世界时则为正值

东时区

格林威治

西时区

GMT &#43;/-

&#43;

-

getTimezoneOffset()

<0

> 0

早/晚

完整代码&#xff1a;

/**

* 获取绝对时间

* 即无论你在哪个时区&#xff0c;得到的时间和京8区的时间一致

*

* &#64;param {Date} time

* &#64;returns {years,month, day, hours, minutes, seconds}

*/

function getAbsTime(time) {

try {

let currentZoneTime &#61; new Date(time);

let currentZoneHours &#61; currentZoneTime.getHours();

let offsetZone &#61; currentZoneTime.getTimezoneOffset() / 60;

if(offsetZone > 0) {

// 大于0的是西区(西区晚) 西区应该用时区绝对值加京八区 重新设置时间

// 西区时间比东区时间晚 所以加时区间隔

offsetZone &#61; offsetZone &#43; 8;

currentZoneTime.setHours(currentZoneHours - offsetZone)

} else {

// 小于0的是东区(东区早) 东区时间直接跟京八区相加

offsetZone &#43;&#61; 8;

currentZoneTime.setHours(currentZoneHours &#43; offsetZone);

}

return transfromDate(currentZoneTime)

} catch(e) {

throw e

}

}

部分类容节选自&#xff1a;



推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
百脑汇_惠州店_909
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有