# 啥是时区?

时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的外置(时角)决定时间,这就使得不同经度的地方的时间各有不同,为了统一使用同一个时间,就引入了时区的概念。时区通过设立一个标准时间部分地解决了这个问题。世界各国位于地球的不同位置,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有偏差,这些偏差就是时差。

# 表示

协调世界时(UTC)是最主要的世界时间标准,其以院子时秒长为基础,在时刻上尽量接近于格林威治标准时间。协调世界时是世界上调调节时钟和时间的主要标准。如果时间是以协调世界时(UTC)表示,则在时间后面加上 “Z”,“Z” 是协调世界时中 0 时区的标志。UTC 时间也叫祖鲁时间,因为在北约音标字母中用 “Zulu” 表示 “Z”。
UTC 偏移量的表示形式为:±[hh]:[mm]、±[hh][mm] 或者 ±[hh]。比如北京时间比协调世界时(UTC)早八小时,那么应当表示为:UTC+8。

JavaScript 获得当前客户端的时区
对象是 ECMAScript 国际化 API 的一个命名空间,它提供了精确的字符串对比、数字格式化和日期格式化。我们需要使用这个 API 的 DateTimeFormat 对象。具体可以参考:MDN Intl.DateTimeFormat

获得客户端当前时区:

Intl.DateTimeFormat().resolvedOptions().timeZone // 'Asia/Shanghai'

可以看到输出: Asia/Shanghai ,即我所在时区为上海。

我们知道了在哪个时区,但是我们需要同时表示 UTC+n 的形式,那我们怎么知道当前时区的 UTC 偏移量呢?

我们可以通过 Date 对象实例的 getTimezoneOffset 方法获取(注意返回的结果的单位为分):

new Date().getTimezoneOffset() // -480

可以看到输出的是 - 480,这样获得到的是 0 时区的时间差 (0 时区减去当前所在时区,单位是分钟)。

中国标准时间是以东八区为准,比 0 时区的时间要早 8 小时。所以是 - 480,除以 60 就是所在时区:然后 - 480 / 60 = -8,即现在这个时区的偏移量为 0 - (-8) = 8,即表示为:UTC+8 ,代码为:

'UTC+' + (0 - new Date().getTimezoneOffset() / 60); // 输出:UTC+8

需要注意的是,不管你以何参数实例化一个 Date 对象,js 在本地存储时,都会转化为本地时区,js 不会帮你存储实例化该日期时的时区信息。

# 参考文献

  • 全球城市 ZoneId 和 UTC 时间偏移量的最全对照表