时区转换:为什么"北京时间加 8 小时"在夏令时会翻车
一次让我在视频会议里干等的尴尬
上季度和纽约同事约了”北京时间早上 9 点”的会。我按时上线,对着空会议室等了近一小时,对方才来,还一脸疑惑:“不是说好我这边晚上 8 点吗?”
一对才发现是夏令时坑了:那段时间纽约是 EDT(UTC-4),不是我默认的 EST(UTC-5)。我按”北京 UTC+8 减 13 小时”算出纽约晚上 8 点,实际那天时差是 12 小时,应该是晚上 9 点。少减一小时,自然扑空。
之后我所有跨国时间沟通都改用正式时区转换器,不再心算。本文把时区里最容易踩的坑讲清楚。
为什么”加 8 小时”不总是对
很多人换算时区的直觉是记几个固定偏移:北京 UTC+8、纽约 UTC-5,相减得 13 小时。冬令时勉强能跑,但有三个坑:
第一,很多时区不是整数偏移。 印度 UTC+5:30,尼泊尔 UTC+5:45,纽芬兰 UTC-3:30。记成整数就差半小时。
第二,夏令时会整体平移一小时。 实行地区的偏移一年里有大半年和另外几个月不同,我的事故就是典型。
第三,切换当天会出现”不存在”或”重复”的时间。 春季凌晨 2:00 直接跳到 3:00,那么 2:30 那天不存在;秋季回拨时 1:30 会出现两次。硬编码加减完全处理不了。
正确做法是基于 IANA 时区名 + 具体时刻去查当时的真实偏移,而不是加减固定小时。
IANA 时区是什么
IANA 维护的 tz database 用”大洲/城市”命名,如 Asia/Shanghai、America/New_York、Europe/London。最大好处是自带历史和政治变更:某城今年夏令时怎么调、十年前怎么调,库里都有。
现代浏览器和 Node.js 都内置这套库,通过 Intl.DateTimeFormat 就能按时区名格式化时间、拿当时的 UTC 偏移。本站工具就基于它:选 America/New_York,它会按你输入的那个具体时刻判断当时是 EDT 还是 EST,不用你操心。
沟通跨国会议时,别用”东部时间”这种模糊说法,直接报 IANA 时区名或 UTC,最不容易出错。
这个工具怎么用
时区转换:选源/目标时区,填源时间,立即得到目标本地时间、目标偏移和对应 UTC。不会填就点”使用当前时刻”。
多时区对照:填一个 UTC 基准时间,下方列出全球三十多个主要城市同一瞬间的本地时间。约跨国会议、排 on-call 时扫一眼就能确认各地不在深夜。
两地时差:选两个时区,直接告诉”B 比 A 快/慢几小时几分钟”,并注明按当前夏令时计算。过几个月再算,时差可能就变了——所以别把时差记死。
全球主要城市时差速查(以北京 UTC+8 为基准)
| 城市 | 冬令时偏移 | 夏令时偏移 |
|---|---|---|
| 伦敦 | UTC+0 | UTC+1 |
| 巴黎 / 柏林 | UTC+1 | UTC+2 |
| 莫斯科 | UTC+3 | UTC+3 |
| 迪拜 | UTC+4 | UTC+4 |
| 新德里 | UTC+5:30 | UTC+5:30 |
| 东京 | UTC+9 | UTC+9 |
| 纽约 | UTC-5 | UTC-4 |
| 洛杉矶 | UTC-8 | UTC-7 |
| 悉尼 | UTC+10 | UTC+11 |
注意东京、悉尼等南半球地区的夏令时和北半球相反,别想当然套用。
常见问题
Q:为什么我算的时差和工具差了一小时? 多半是夏令时。工具按你输入的具体日期计算,而你脑子里记的是另一个季节的偏移。
Q:UTC 和 GMT 是一回事吗? 日常换算可以近似等同,但严格说 GMT 是时区、UTC 是时间标准,且 GMT 不实行夏令时。跨国沟通报 UTC 最稳。
Q:服务器日志都是 UTC,怎么快速看懂? 在工具里把源时区选 UTC,目标选你所在时区,填日志时间即可。也可以直接用时间戳转换工具先把日志时间戳转成 UTC 再换。
Q:中国为什么不实行夏令时? 中国 1991 年后已取消夏令时,全年固定 UTC+8,所以国内跨城市不存在时差,只有和境外才有。
Q:半小时偏移的地区怎么处理? 正是硬编码加减最容易错的地方,交给基于 IANA 的工具即可,比如新德里 UTC+5:30 会被精确处理。
Q:夏令时切换当天的时间怎么算? 工具按具体时刻查库,会自动跳过或重复处理,你只需填真实想表达的那个时刻。