时区

927 阅读3分钟

背景:做国际化会遇到时区的问题。

结论:了解时区的相关概念。


时区

由于地球很大,每个地方经历的昼夜都不一样。

而大家又习惯于时间和昼夜的对应关系,比如正午就是12点

从而分出了时区的概念,让时间相对统一,而不是绝对统一

全球划分为了24个时区,零时区,东12个区,西12个区,每个区相差1个小时。

零时区在英国(格林尼治天文台旧址)

时区列表见 www.zeitverschiebung.net/cn/all-time…

UTC偏移量

UTC偏移量是协调世界时(UTC)和特定地点的日期与时间差异,其单位为小时和分钟。

时区 Asia/Shanghai 的偏移量是 +08:00,也可用 UTC+8 表示。

不同时区的偏移量会一致。如中国台湾 Asia/Taipei 偏移量也是 +08:00。

时间标准

UTC。 是根据原子钟来计算时间。

GMT。是英国格林尼治天文台观测太阳每天经过它的时间就是中午12点。

时间格式

1 RFC-2822标准格式

Thu Sep 07 2023 22:30:40 GMT+0800 (中国标准时间)

其中 GMT+0800 表示 GMT时间 +8 小时,即东八区。

2 ISO-8601标准格式

2023-09-07T22:30:40+08:00

T 后面表示的是时分秒,+08:00 表示东八区。

如果是零时区,则可以表示成

2023-09-07T22:30:40.400Z

其中 Z 是零时区,Z 前面的 40.400 是 秒, 小数点保留三位。

时区获取

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

时区是 Asia/Shanghai,而不是北京。

原因是1949年以前,中国一共分了5个时区,以哈尔滨 ( Asia/Harbin)、上海(Asia/Shanghai)、重庆(Asia/Chongqing)、乌鲁木齐(Asia/Urumqi)、喀什(Asia/Kashgar)为代表——分别是:长白时区GMT+8:30、中原标准时区 GMT+8、陇蜀时区GMT+7、新藏时区GMT+6和昆仑时区GMT+5:30。它是1912年北京观象台制订,后由内政部批准过。而且从国际标准本身的角度来看,北京和上海处于同一时区,只能保留一个。而作为时区代表上海已经存在,并且足够具有代表性,因此其维护者没有足够的动力做出改变。所以目前还没有Asia/Beijing。

时区转换

比如看美国时区

new Date().toLocaleString("chinese",{
   hour12:false,
   timeZone:"America/New_York"
}) // 2023/9/7 10:43:29

时区对齐

使用绝对的时间。如 使用时间戳,最简单。

或者使用包含时区的时间戳。

dayjs 使用时区

const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const timezone = require('dayjs/plugin/timezone');

dayjs.extend(utc);
dayjs.extend(timezone);

// 获取当前时区
Intl.DateTimeFormat().resolvedOptions().timeZone; // 'Asia/Shanghai'

// 当前时区的 2023-10-01 00:00:00
dayjs('2023-10-01 00:00:00').format(); // 2023-10-01T00:00:00+08:00
dayjs.tz('2023-10-01 00:00:00').format(); // 2023-10-01T00:00:00+08:00

// 当前时区时间转成美国时区
dayjs('2023-10-01 00:00:00').tz('America/New_York').valueOf(); // 1696089600000
// 美国时间慢 12H
dayjs.tz('2023-09-30 12:00:00', 'America/New_York').valueOf(); // 1696089600000

// 默认本地时区的表达
dayjs('2023-10-01 00:00:00').format(); // 2023-10-01T00:00:00+08:00
// 换成 UTC 形式的表达
dayjs('2023-10-01 00:00:00').utc().format(); // 2023-09-30T16:00:00Z