0%

JavaScript时间处理

相关概念

时区

在地球上不同地方的人看到太阳升起的时间不一致,就有了时区的概念。例如北京早上8:00可以看到太阳刚刚升起,而欧洲此时还在夜晚,大概是凌晨1:00。他们看到当天太阳升起的时间应该是北京时间的下午3点,所以就有下面这样一个等式:

1
"2014-10-14 08:00 +8:00" = "2014-10-14 01:00 +1:00"

标准时间

GMT即格林威治标准时间,指英国伦敦郊区的皇家格林威治天文台的标准时间,因为本初子午线被定位为通过此地的经线。由于地球不规则自转,导致GMT时间有误差,因此目前已不被当作标准时间使用。UTC是最主要的世界时间标准,是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间。UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。不过日常使用中,GMT与UTC的功能与精确度是没有差别的。协调世界时区会使用“Z”来表示。而在航空上,所有使用的时间划一规定是协调世界时。

TimeZone&UTC Offsets:时区与偏移

人们经常会把时区与UTC偏移量搞混,UTC偏移量代表了某个具体的时间值与UTC时间之间的差异,通常用HH:mm形式表述。而TimeZone则表示某个地理区域,某个TimeZone中往往会包含多个偏移量,而多个时区可能在一年的某些时间有相同的偏移量。譬如America/Chicago, America/Denver, 以及 America/Belize在一年中不同的时间都会包含 -06:00 这个偏移。

时间戳

Unix时间戳表示当前时间到1970年1月1日00:00:00 UTC对应的秒数。注意,JavaScript内的时间戳指的是当前时间到1970年1月1日00:00:00 UTC对应的毫秒数,和unix时间戳不是一个概念,后者表示秒数,差了1000倍。

时间数字字符串格式

RFC2822
1
YYYY/MM/DD HH:MM:SS ± timezone(时区用4位数字表示)
ISO 8601(国际标准)
1
YYYY-MM-DDThh:mm:ss ± timezone(时区用HH:MM表示)

常见时间使用问题

服务器部署地不一致

如果使用的是带时区的字符串转换的Moment对象,服务器部署地不一致时可能会导致某些测试failed。比如:

1
2
3
4
5
1997-07-16T08:20:30Z
// “Z”表示UTC标准时区,即"00:00",所以这里表示零时区的`1997年7月16日08时20分30秒`
//转换成位于东八区的北京时间则为`1997年7月16日16时20分30秒`
1997-07-16T19:20:30+01:00
// 表示东一区的1997年7月16日19时20秒30分,转换成UTC标准时间的话是1997-07-16T18:20:30Z

如果有一个界面的snapshot测试,并且界面显示为日期和时间的字符串,在不同的服务器上运行就会导致界面不一致,从而影响测试。解决方法是使用不带时区的mockData去测试。值得注意的是在使用不带时区的字符串时,转换出来的是当地时间,当转换为时间戳时,不同地区的时间戳也不一样,所以使用时应该注意。