js设置北京时区_如何使不同时区的时间与京8区⼀致?(JS实
现)
如何使不同时区的时间与京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⽇期格式见:
const re_iso8601 = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?T(?:(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?)?Z?$/;
const _toString = String;
// 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 = (input);
if (r) {
return new Date(~~r[1], ~~r[2]-1, ~~r[3], ~~r[4], ~~r[5], ~~r[6]);
}
r = (input);
if (r) {
/
/ month/date缺省值为1⽉/1⽇
let month = ~~r[2] - 1;
if (month < 0) month = 0;
let date = ~~r[3];
if (date === 0) date = 1;
return new Date(Date.UTC(~~r[1], month, date, ~~r[4], ~~r[5], ~~r[6], ~~r[7]));
}
return new Date(input);
}
}
----------------------------分割线-------------------------------
⼀般⽽⾔,我们都以时间戳的⽅式存储某个时间。在需要的时候提取出来,根据不同业务需求进⾏转化:
function transfromDate(time) {
// 假设time是时间戳,如:1514273945276
let curDate = new Data(time);
// todo
}
这⾥存在⼀个潜在问题——改变本机的时区,curDate的值会发⽣变化!shit
当Date作为构造函数调⽤并传⼊多个参数时,所定义参数代表的是当地时间
MDN
即,构造出的⽇期⽤来显⽰时,会被转换为本地时间(调⽤ toString ⽅法):
>new Date()
GMT AND UTC
GMT+0800是个什么东西呢?我们先来介绍⼀些可能当年在地理课上学习过的基本概念。
以前⼈们通过观察太阳的位置来决定时间(⽐如:使⽤⽇晷),这就使得不同经纬度的地区时间是不⼀样的。后来⼈们进⼀步规定以⼦午线为中⼼,向东西两侧延伸,每 15 度划分⼀个时区,刚好是 24 个时区。然后因为⼀天有 24 ⼩时,地球⾃转⼀圈是 360 度,360 度 / 24⼩时 = 15 度/⼩时,所以每差⼀个时区,时间就差⼀个⼩时。
GMT:
最开始的标准时间(⼦午线中⼼处的时间)是英国伦敦的皇家格林威治天⽂台的标准时间(因为它刚好在本初⼦午线经过的地⽅),这就是我们常说的 GMT(Greenwich Mean Time)。
然后其他各个时区根据标准时间确定⾃⼰的时间,往东的时区时间早(表⽰为 GMT+hh:mm)、往西的时区时间晚(表⽰为 GMT-hh:mm)。⽐如,中国标准时间是东⼋区,我们的时间就总是⽐ GMT 时间早 8 ⼩时,他们在早晨 9 点,我们才凌晨 1 点。
所以,GMT+0800 表⽰早于格林威治时间8⼩时。
UTC:
但是GMT其实是根据地球⾃转、公转计算的(太阳每天经过英国伦敦皇家格林威治天⽂台的时间为中午 12 点),不是⾮常准确,于是后⾯提出了根据原⼦钟计算的标准时间 UTC(Coordinated Universal Time)。
⼀般情况下,GMT 和 UTC 可以互换,但是实际上,GMT 是⼀个时区,⽽ UTC 是⼀个时间标准。
JS使不同时区的时间与京8区⼀致
要计算不同时区相对于京8区的时间偏差,我们要借助 Javascript 中的 Date 对象的实例⽅法 getTimezoneOffset(): getTimezoneOffset() ⽅法返回协调世界时(UTC)相对于当前时区的时间差值,单位为分钟。
如果本地时区早于协调世界时(UTC),则该差值为负值,如果晚于协调世界时则为正值
东时区
格林威治
西时区
GMT +/-
+
-
getTimezoneOffset()
< 0
> 0
早/晚
早
晚
完整代码:
/**
* 获取绝对时间
* 即⽆论你在哪个时区,得到的时间和京8区的时间⼀致
*
* @param {Date} time
* @returns {years,month, day, hours, minutes, seconds}
*/
原生js和js的区别function getAbsTime(time) {
try {
let currentZoneTime = new Date(time);
let currentZoneHours = Hours();
let offsetZone = TimezoneOffset() / 60;
if(offsetZone > 0) {
/
/ ⼤于0的是西区(西区晚) 西区应该⽤时区绝对值加京⼋区 重新设置时间
// 西区时间⽐东区时间晚 所以加时区间隔
offsetZone = offsetZone + 8;
currentZoneTime.setHours(currentZoneHours - offsetZone) } else {
// ⼩于0的是东区(东区早) 东区时间直接跟京⼋区相加
offsetZone += 8;
currentZoneTime.setHours(currentZoneHours + offsetZone); }
return transfromDate(currentZoneTime)
} catch(e) {
throw e
}
}
部分类容节选⾃:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论