相关概念
时区
在地球上不同地方的人看到太阳升起的时间不一致,就有了时区的概念。例如北京早上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 | 1997-07-16T08:20:30Z |
如果有一个界面的snapshot测试,并且界面显示为日期和时间的字符串,在不同的服务器上运行就会导致界面不一致,从而影响测试。解决方法是使用不带时区的mockData去测试。值得注意的是在使用不带时区的字符串时,转换出来的是当地时间,当转换为时间戳时,不同地区的时间戳也不一样,所以使用时应该注意。