js中UTC时间需要转换时区吗

js中UTC时间需要转换时区吗,第1张

经常混淆于此,特地研究了一下,记录在此以备忘。整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC,UniversalTimeCoordinated)。UTC与格林尼治平均时(GMT,GreenwichMeanTime)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行:Date:Fri,08Nov200209:42:22+0800说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800,就是东八区时间)。电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午。以这个电子邮件的发送时间为例,如果要把这个时间转化为UTC,可以使用一下公式:UTC+时区差=本地时间时区差东为正,西为负。在此,把东八区时区差记为+0800,UTC+(+0800)=本地(北京)时间(1)那么,UTC=本地时间(北京时间))-0800(2)0942-0800=0142即UTC是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是0432(凌晨四点三十二分),那么,UTC就是0432-0800=-0368,负号意味着是前一天,-0368+2400=2032,既前一天的晚上八点三十二分。纽约的时区是西五区,比UTC落后五个小时,记为-0500:UTC+(-0500)=纽约时间(3)UTC=纽约时间+0500(4)把(2)式-(4)式相比较,UTC=北京时间-0800=纽约时间+0500(5)即北京时间=纽约时间+1300(6)即北京时间领先纽约时间十三个小时,由(6)式,纽约时间=北京时间-1300(7)在四月下旬,纽约又换用夏令时,又称为日光节约时,比标准纽约时间提前一个小时,实际成为西四区的标准时间,成为-0400。UTC+(-0400)=纽约夏令时,套用以上公式,北京时间=纽约夏令时+1200纽约夏令时=北京时间-1200在这些转换中,最重要的公式就是UTC+时区差=本地时间时区差东为正,西为负。例如,东八区(北京)是+0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区是西六区,-0600,美国山地时区是西七区,-0700,太平洋时区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区是东一区,+0100,夏天变为+0200。多数电子邮件程序,例如OutlookExpress,在显示时间时,计算机程序把时间先转换成为本地时间再显示,例如,邮件的Date域为:Date:Fri,08Nov200209:42:22+0800

ajax获取服务器返回的世界时后,js中new Date()后会自动加上客户端的时区,所以要处理掉这个时区偏移,才能得到正确的世界时;

然后在在此基础上,加上北京时区的偏移量,得到正确的北京 时。

$ajax({

url:'index/getServerTime',

type:'get',

dataType:'json',

success:function(data){

//1服务器为世界时,data为世界时的毫秒数(时间戳)

//2获取客户端时区与UTC世界时的时间差毫秒数

var offset = new Date()getTimezoneOffset()60000;

//3世界时=服务器世界时+时区差

var timeWorld = new Date(data+offset);

//4北京时=服务器世界时+时区差+北京时区差(UTC+08)

var timeBeijing = new Date(data+offset+860601000);

}

})

旧版本(012/530)

最近遇到了时区设置的问题

在Nodejs中,取当前时间(GMT格式)可以使用Date

var GMTDate = new Date();//Sun Mar 06 2016 20:42:44 GMT-0500 (GMT)1

但有时候server的时间要求是GreenWich时间,就是零时区

可以这样设置

processenvTZ = 'Europe/London';//可以切换到任意时区var date = new Date();

consolelog(date);//Mon Mar 07 2016 01:44:04 GMT+0000 (GMT)1234

问题解决

写文章的时候笔者还在使用012版本,经过测试,上面的代码在v530中还可以正常发挥做用,但在694或者最新的760中都不能正常工作了。

在旧的版本中,打印一个date对象返回的是当前时区的时间,但在新版的Node中,直接返回的就算是世界时,也就是greenwich时间,相比东八区要早8个小时,格式也不再是GMT格式,这代表开发者就算要获取当前时间都要做一下额外转换。

var date = new Date();//2017-04-30T14:44:10977Z 世界时间consolelog(date);

//4/30/2017, 10:44:10 PM 转换成本地时间consolelog(datetoLocaleString());12345

稍微在网络上搜索一下,可以发现一个名为timezone的npm模块,如果读者有兴趣可以自行探索该模块的使用方法,在本节的内容里,笔者打算自己实现可用的模块。

自己实现timezone的修改

经过试验,虽然设置processenvTZ的方法不能用了,但我们完全可以自己实现一套代码出来。

为此,我们首先在Date对象的prototype上声明一个map结构作为属性,用于存储时区名称和偏移量的关系,然后对Date类的Date方法进行修改,如果没有声明processenvTZ变量,就默认返回原来的date对象,如果声明了该属性,就先到对应的数组中进行搜索,然后返回修改后的date对象。

processenvTZ = "America/New_York";DateprototypeTimeZone = new Map([

['Europe/London',0],

['Asia/Shanghai',-8],

['America/New_York',5]

])DateprototypezoneDate = function(){

if(processenvTZ == undefined){ return new Date();

}else{ for (let item of thisTimeZoneentries()) { if(item[0] == processenvTZ){ let d = new Date();

dsetHours(dgetHours()+item[1]); return d;

}

} return new Date();

}

}var date = new Date()zoneDate();

consolelog(date);1234567891011121314151617181920212223

在上面的代码里,如果声明了processenvTZ这一属性,再调用zoneDate就能得到对应时区的date啦

以上就是关于js中UTC时间需要转换时区吗全部的内容,包括:js中UTC时间需要转换时区吗、代码中存在字符串(UTC+08:00)Taipei,(UTC+08:00)Beijing,Chongqing,HongKong,Urumchi怎么转换成时区id值、Nodejs 修改 Linux 时间、时区等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9572182.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存