
经常混淆于此,特地研究了一下,记录在此以备忘。整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(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 时间、时区等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)