背景:做国际化会遇到时区的问题。
结论:了解时区的相关概念。
时区
由于地球很大,每个地方经历的昼夜都不一样。
而大家又习惯于时间和昼夜的对应关系,比如正午就是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