时区

把地球分为24个时区,也就是一个区跨度时间为一个小时,一个周期整好是地球自转一周,也就是一天,完成白昼黑夜的轮回。规定将格林威治天文台所在地为起始点, 向东依次为12个正时区,表示比起始点依次多12个小时,向西依次12个负时区,表示比起始点依次少12个小时。比如咱们中国为东8区,比格林威治时间早8个小时。

  1. Date.UTC(1970,0,2) // 86400000 = 24 hours
  2. Date.parse('Jan 2 1970') // 57600000 = 16 hours
  3. new Date('Jan 2 1970').getTime() // 57600000 = 16 hours
  4. new Date('Jan 2 1970').valueOf() // 57600000 = 16 hours
  5. // 第二天8点
  6. new Date(86400000) // Fri Jan 02 1970 08:00:00 GMT+0800 (中国标准时间)

setUTCXxxx method

setUTCFullYear

dateObj.setUTCFullYear(yearValue[, monthValue[, dayValue]])

如果你不传 monthValue 和 dayValue,那么它会使用 getUTCMonth() getUTCDate() 返回的值

setUTCHours

dateObj.setUTCHours(hoursValue[, minutesValue[, secondsValue[, msValue]]])

var theBigDay = new Date(); // theBigDay = Thu May 19 2016 16:10:33 GMT+0800 (中国标准时间)
theBigDay.setUTCHours(2); // theBigDay = Thu May 19 2016 10:10:33 GMT+0800 (中国标准时间)

如果你不传 minutesValue, secondsValue 和 msValue getUTCMinutes() getUTCSeconds() getUTCMilliseconds() 返回的值

由于是东8区,所以使用 setUTCXxxx 方法设置出来的时间都多8个小时

UTC时间转当地时间方法

注意: 由于浏览器之间的差异与不一致性,强烈不推荐使用Date构造函数来解析日期字符串 (或使用与其等价的Date.parse)。对 RFC 2822 格式的日期仅有约定俗称的支持。 对 ISO 8601 格式的支持中,仅有日期的串 (例如 “1970-01-01”) 会被处理为 UTC 而不是本地时间,与其他格式的串的处理不同。

new Date(new Date.UTC(2020, 0, 1))

时间格式表示法

为啥整2套标准,难道是因为kpi吗?

RFC2822规范

YYYY/MM/DD HH:MM:SS ± timezon

ISO 8601规范:

2004-05-03T17:30:08+08:00 表示东八区的时间点

生成时间对象时,没带时区信息时,生成的是本地时区的时间点

new Date('1995-12-17T03:24:00') // Sun Dec 17 1995 03:24:00 GMT+0800 (中国标准时间)

// 结果同上一样
new Date('1995-12-17T03:24:00+0800') // Sun Dec 17 1995 03:24:00 GMT+0800 (中国标准时间)

// 由于末尾的Z表示是0时区,所以对应东八区时间多了8小时
new Date('1995-12-17T03:24:00Z') // Sun Dec 17 1995 11:24:00 GMT+0800 (中国标准时间)

参考

国际标准ISO 8601,国际标准化组织的日期和时间的表示方法
时区与JS中的Date对象