时间戳、时区以及时间格式

一、时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数

注:时间戳是不会跟着时区的改变而改变,同一时刻的时间戳都是相同的。


二、GMTUTC

格林威治标准时间GMT
1
十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的「格林威治标准时间(Greenwich Mean Time,简称G.M.T.)的由来,标示在手表上,则代表此表具有两地时间功能,也就是同时可以显示原居地和另一个国度的时间。
世界协调时间UTC
1
多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是Coordinated Universal Time-世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

注:

  • 两者的区别在于前者是一个天文上的概念,而后者是基于一个原子钟。
  • 在UTC中,每一年或两年会有一个“闰秒”。


三、时区

整个地球分为二十四时区,每个时区都有自己的本地时间 。本地时间 = UTC + 时区差时区差东为正,西为负。因此,把东八时区(北京时间 )记为 UTC+8


四、表示时间的格式/标准

1、RFC-2822标准格式,形如:
1
2
3
4
// GMT+0800(CST)代表东八区
// CST(china standard time)表示中国标准时间

Sun Apr 08 2018 11:38:39 GMT+0800(CST)
2、ISO-8601标准格式,其中一种常见的格式形如:
1
2
2018-04-08T11:38:39+08:00  // 日期用'-'相隔,与时间用'T'连接
2018-04-08T11:38:39Z // Z代表UTC时间,Z也可写成00:00


ISO 8601的标准格式是:YYYY-MM-DDTHH:mm:ss.sssZ,分别表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
YYYY:年份,0000 ~ 9999
MM:月份,01 ~ 12
DD:日,01 ~ 31
T:分隔日期和时间
HH:小时,00 ~ 24
mm:分钟,00 ~ 59
ss:秒,00 ~ 59
.sss:毫秒
Z:时区,可以是:Z(UFC)、+HH:mm、-HH:mm

// ISO格式例子
// 1997
// 1997-07
// 1997-07-16
// 1997-07-16T19:20 + 01:00
// 1997-07-16T19:20:30 + 01:00
// 1997-07-16T19:20:30.45 + 01:00


五、JS Date

JavaScript内部,所有日期和时间都储存为一个整数,表示当前时间距离1970年1月1日00:00:00毫秒数正负的范围为基准时间前后各1亿天。

1
2
3
4
5
6
7
8
9
10
11
// 依据系统设置的当前时间来创建一个Date对象
new Date();

// 时间戳
new Date(value);

// 表示日期的字符串值。该字符串应该能被 Date.parse() 方法识别
new Date(dateString);

// 当Date作为构造函数调用并传入多个参数时,所定义参数代表的是当地时间
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);


1、new Date(dateString)中的ISO格式

ES5之中,如果日期采用连词线(-)格式分隔,且具有前导0,JavaScript会认为这是一个ISO格式的日期字符串,导致返回的时间是以UTC时区计算的。

1
2
3
4
5
new Date('2014-01-01')
// Wed Jan 01 2014 08:00:00 GMT+0800 (CST)

new Date('2014-1-1')
// Wed Jan 01 2014 00:00:00 GMT+0800 (CST)

在ES5之中,如果日期采用连词线(-)格式分隔,且没有前导0,JavaScript引擎假设用户处于本地时区。


ES6 改变了这种做法,规定凡是没有指定时区的日期字符串,一律认定用户处于本地时区。

对于其他格式的日期字符串,一律视为非ISO格式,采用本地时区作为计时标准。

1
2
3
4
5
new Date('2014-12-11')
// Thu Dec 11 2014 08:00:00 GMT+0800 (CST)

new Date('2014/12/11')
// Thu Dec 11 2014 00:00:00 GMT+0800 (CST)

注:上面代码中,第一个日期字符串是ISO格式,第二个不是