ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

全球时区换算避坑指南:UTC偏移与夏令时详解

全球时区换算避坑指南:UTC偏移与夏令时详解 很多人第一次接触全球时区不是在上学时背世界地图而是在跨国会议、跨境电商或者买美股基金的某个瞬间被绕晕的。我的切身体验是周五晚上七点同事在美国用的是PST我打开日历算成北京时间差点错过一个里程碑评审。后来认真把UTC、GMT、CST、EDT这些缩写搞清楚之后才明白这个坑几乎每个人都要踩一遍。这篇文章不聊抽象理论就把时区缩写、UTC偏移、夏令时这些大家最容易混淆的概念掰开揉碎讲清楚。1. 从几点开会说起为什么时区缩写容易把人绕晕时区问题看上去是纯地理知识但真正用起来的时候你会发现它更像一个信息编码问题——同样三个字母可能代表完全不同的时间区域。比如CST在美国人口中是中部标准时间Central Standard Time在中国人口中是北京时间China Standard Time在古巴人口中又成了古巴标准时间Cuba Standard Time。同一个缩写三个地区三种含义这就是为什么光看缩写没法确定时间必须和UTC偏移量结合起来。还有一个容易被忽略的点时区不是简单按经度画线的。1884年国际经度会议把全球划成24个时区每个时区理论上15度经度跨一个但现实中国家边界、行政区划、甚至经济合作需求都会让时区边界变得奇奇怪怪。有的国家横跨多个时区却统一用一个时间有的国家只有一块小领地却选择了一个极端的偏移比如尼泊尔用UTC05:45查塔姆群岛用UTC12:45偏移量还带45分钟甚至30分钟。所以如果你以为全球时区之间的差都是整小时那实践中一定会出事。对普通用户来说最核心的使用场景无非三个一是看海外同事或客户的工作时间二是看美股、欧股的开盘收盘时间三是安排跨国旅行和直播活动。这三个场景的底层逻辑一样任何本地时间都可以写成UTC偏移量 本地时刻的形式只要把这个偏移量算清楚全球时钟就尽在掌握。本文后面所有内容都是为了让你在面对任何时区缩写时能完成这个映射。坦白说查时区这件事并不难难的是你知道该查什么、该怎么换算。很多人出错并不是不会减法而是把缩写认错了或者忽略了夏令时切换。所以接下来我会先讲UTC这个基准再把最常见的北美缩写挨个拆解接着给一张全球主要城市对照表最后专门用一个章节讲夏令时再讲一点跨时区换算的实际操作。这样无论你是开发、运营、外贸还是普通旅行者都能拿走直接能用。2. UTC、GMT与协调世界时把基准先讲明白2.1 UTC 到底是什么UTC是协调世界时Coordinated Universal Time的缩写。注意这个缩写的顺序有点特殊法语是Temps Universel Coordonné按理缩写应该是TUC英语是Coordinated Universal Time按理是CUT最后国际电信联盟统一采用UTC算是英法两种语言的折中方案。今天它已经是全球所有时区换算的绝对基准全球被分成多少个时区每个时区的本地时间都是相对UTC加或减若干小时来定义的。UTC本身是从原子时衍生出来的。地球自转不是匀速的会受月球潮汐、地震、季节变化等因素影响因此按天文观测得到的世界时UT1并不稳定。UTC采用的是铯原子钟计时的国际原子时TAI再通过闰秒机制偶尔把原子时和天文时间对齐。自1972年施行协调世界时以来累计已经加入了27个闰秒不过2023年国际计量大会已经决定在2035年前废除闰秒改用其他方式。对这个基准而言我们普通人只需要记住一句话UTC是一把恒定的尺子全球时区都拿它当零点。2.2 GMT和UTC到底哪里不一样GMTGreenwich Mean Time格林尼治标准时间是更老的一个概念指太阳经过英国伦敦格林尼治天文台子午线时所在的时间。19世纪全球铁路发展和航海导航需求旺盛1884年华盛顿国际子午线会议正式把格林尼治子午线定为经度零度线GMT因此成为全球时间的参考基准。但GMT本质上是天文时间靠地球自转确定UTC本质上是原子时间靠原子振荡周期确定。理论上两者会有最多0.9秒的差距不过对民用计时来说这个差距完全可以忽略。今天很多操作系统里GMT和UTC几乎可以互换但在科学和通信领域精确计时只用UTC。你只需要记住日常口语和会议安排里把GMT当成UTC的旧称完全没问题但如果你写代码或者做数据同步数据库里一律存UTC不要存GMT因为很多系统对GMT的处理并不严格划一。2.3 UTC的写法与Z后缀UTC时间可以用24小时制表达比如14:30 UTC。更学术的写法是加一个后缀Z这是军事和航空领域沿用的习惯Z代表Zulu time祖鲁时间其实就是零时区。日志和网络协议里经常看到形如2024-10-16T14:30:00Z的字符串这里的Z就代表UTC。ISO 8601标准也推荐用这种方式。在日常沟通中UTC绝对不应该被时区化——它是全球统一的基准永远没有夏令时也不会因为地区而变化。清晰地区分UTC时间和本地时间是避免时区混乱的第一步。很多线上排障工具、日志分析系统、数据库默认时间戳都采用UTC如果前端展示时不做本地化用户看到的就是一个没有偏移的时间这时候你需要做的是转换而不是修改存储值。3. 常见时区缩写逐个拆解PST、EST、CST、MST北美的时区缩写是大家接触最多的因为整个美国本土横跨四个时区加上阿拉斯加和夏威夷一共六个时区。大多数跨国协作的同事、客户、开源社区都在这些时区工作。拆解清楚这四个缩写基本就解决了日常一半的问题。3.1 美东与美西EST/EDT与PST/PDT先说东海岸。EST全称Eastern Standard Time东部标准时间对应UTC-05:00。每年11月到次年3月期间美国东部处于冬季标准时间就用EST。从3月第二个周日到11月第一个周日美国进入夏令时东部时间变成EDT东部夏令时间Eastern Daylight Time对应UTC-04:00。纽约、华盛顿、迈阿密、亚特兰大都在这个时区。西海岸的PST全称Pacific Standard Time太平洋标准时间对应UTC-08:00。夏令时期间变成PDT太平洋夏令时间对应UTC-07:00。洛杉矶、旧金山、西雅图、温哥华都在这里。这里有个新手常踩的坑有人以为美国西部时间就是UTC-8这个说法只在冬季成立夏季实际是UTC-7。美股开盘时间按美东算而硅谷工程师写代码按美西算两者相差3小时。美国中部芝加哥、达拉斯、休斯顿用CST/CDT中部标准时间UTC-06:00夏令时UTC-05:00山地区域丹佛、盐湖城用MST/MDT山地标准时间UTC-07:00夏令时UTC-06:00。特别注意美国并不是所有地区都实行夏令时亚利桑那州大部分地区不实行夏威夷州也不实行。所以同一个PST/EST换算你可能还要先问对方你在哪个州。3.2 CST 的全球歧义三个时区共享一个缩写CST这组字母是重灾区。在北美它指中部标准时间Central Standard Time对应UTC-06:00在中国它指中国标准时间China Standard Time对应UTC08:00在古巴它指古巴标准时间Cuba Standard Time对应UTC-05:00。三个时间相差十几小时如果你是做外贸的邮件里看到CST一定要小心。解决这个歧义的办法只有一个放弃只看缩写强制自己和对方写明UTC偏移。比如你说北京时间UTC8对方说芝加哥时间UTC-6双方在日历邀请里再自动换算基本就不会出错。在我自己的团队里约定写作规范是北京时间10:00UTC08:00跨洋沟通时也要求对方写明PST或PDT否则默认按标准时间理解但要在会议前二次确认。3.3 常见北美时区缩写的完整对照表下面这张表是目前最常用的北美时区缩写对照建议收藏备用缩写英文全称中文全称UTC偏移标准时间对应主要城市UTCCoordinated Universal Time协调世界时0全球基准GMTGreenwich Mean Time格林尼治标准时间0民用近似伦敦冬令时PSTPacific Standard Time太平洋标准时间-08:00洛杉矶、西雅图、温哥华PDTPacific Daylight Time太平洋夏令时间-07:00同上夏令时MSTMountain Standard Time山地标准时间-07:00丹佛、盐湖城MDTMountain Daylight Time山地夏令时间-06:00同上夏令时CSTCentral Standard Time中部标准时间-06:00芝加哥、达拉斯CDTCentral Daylight Time中部夏令时间-05:00同上夏令时ESTEastern Standard Time东部标准时间-05:00纽约、华盛顿、迈阿密EDTEastern Daylight Time东部夏令时间-04:00同上夏令时表格之外我还想提醒一点北美夏令时切换的日期统一为3月第二个周日凌晨2点开始、11月第一个周日凌晨2点结束。这意味着春季切换那天当天只有23小时秋季切换那天当天有25小时。提前安排会议时尽量避开切换日的前后12小时因为很多系统、设备、日历的时区库会有更新延迟容易产生一小时误差。4. UTC08:00 与全球主要城市时区对照一张表看懂各地时间说完了北美再把眼界放大到全球。全球民用时区大概有40个左右因为很多地方采用30分钟或45分钟的偏移。这里先列一个常用对照表覆盖大家高频接触的金融中心、科技中心和旅行目的地城市/地区时区简称UTC偏移标准时夏令时偏移备注北京、上海、香港、新加坡CST中国标准时间/ SGT新加坡时间UTC08:00无新加坡英文常用SGT东京JSTUTC09:00无日本全国统一首尔KSTUTC09:00无韩国全国统一悉尼AEST/AEDTUTC10:00UTC11:00南半球夏令时反季伦敦GMT/BSTUTC00:00UTC01:00BST是英国夏令时巴黎、柏林、罗马CET/CESTUTC01:00UTC02:00欧盟统一莫斯科MSKUTC03:00无俄罗斯近年来弃用夏令时迪拜GSTUTC04:00无海湾国家普遍无DST孟买/新德里ISTUTC05:30无印度特色半时区纽约冬季ESTUTC-05:00UTC-04:00EDT看美股注意洛杉矶冬季PSTUTC-08:00UTC-07:00PDT美国西部圣保罗BRT/BRSTUTC-03:00UTC-02:00巴西夏令时已取消多时需按年确认奥克兰NZST/NZDTUTC12:00UTC13:00全球最早进入新年这张表里有几个值得注意的点。IST这个缩写同样有歧义它可能指印度标准时间Indian Standard Time、爱尔兰标准时间Irish Standard Time或以色列标准时间Israel Standard Time。印度用UTC05:30但爱尔兰在夏季用的是UTC01:00两者相差4.5小时。再看CET与CEST。中欧时间Central European TimeUTC01:00覆盖德国、法国、意大利、西班牙、波兰等大部分欧洲国家每年3月最后一个周日到10月最后一个周日切到CEST中欧夏令时UTC02:00。欧盟曾经计划废除季节性时制切换但各成员国一直没达成共识目前仍维持夏令时制度。澳大利亚比较特殊悉尼所在的东岸新南威尔士州用AEST澳大利亚东部标准时间UTC10:00夏令时AEDT为UTC11:00。南半球的夏令时和北半球正好相反——北半球春夏实行夏令时南半球则是10月到次年4月实行。所以在北半球还是夏天的时候你和悉尼同事开会两边都可能处在夏令时状态但偏移方向完全不一样。这也是跨半球协作最容易犯迷糊的地方因为你的夏令时直觉完全不适用对方。做全球化产品时我给你一个实用建议后端所有时间戳一律存UTC0前端或服务端根据用户的IANA时区ID比如Asia/Shanghai、America/Los_Angeles、Europe/Berlin去动态渲染本地时间不要在后端写死东八区或美西时间。数据库字段里也统一用带时区的timestamp类型避免出现同一列数据一半是UTC一半是本地时间的灾难。5. 夏令时DST如何把时区缩写搞乱机制与判断方法5.1 夏令时的底层逻辑夏令时Daylight Saving Time, DST的核心想法很简单春夏季节日照时间长把时钟拨快一小时让人们早起一小时、晚上早黑一小时从而减少照明用电。这个想法最早可以追溯到本杰明·富兰克林的论文第一次大规模实施是1916年德国为了节省一战时期的燃料。今天欧美、澳大利亚、新西兰等地仍然大面积使用夏令时而中国自1992年起已经不再实行。DST对时区换算的冲击是偏移量变了。同一个城市一年中会有两个合法的UTC偏移。比如纽约标准时间是UTC-05:00夏令时变成UTC-04:00。如果你按固定偏移纽约UTC-5去计算夏天一小时就错了这个错足以让你错过会议。5.2 如何快速判断对方当前用哪个缩写和偏移在实际沟通中快速判断对方是否处于夏令时我一般用两个方法。第一个是记切换周期的口诀北半球大致是3月切夏、11月切冬欧洲是3月最后一个周日到10月最后一个周日北美是3月第二个周日到11月第一个周日。如果当前日期在3月中旬到10月底之间北美和欧洲大概率都在夏令时如果在11月中旬到2月底之间北半球大概率都在标准时间。这个粗略判断用于会议安排足够了。第二个是直接借助工具。我会在手机里同时添加几个世界时钟——纽约、洛杉矶、伦敦、东京、悉尼。每次看到对方发来的PST时间我先打开世界时钟看一眼现在洛杉矶是不是夏令时再决定按UTC-7还是UTC-8换算。也可以直接使用在线世界时间工具或会议邀请插件它们内部已经内置了时区数据库你只要把城市名填对就行。5.3 夏令时切换日的幽灵时间还有一个容易被忽略的现象夏令时切换当天有一小时要么消失要么重复。举例来说美东2024年3月10日凌晨2点切换到3点那么凌晨2点到3点这个小时在时钟上不存在。反过来11月3日凌晨2点回到1点那么1点到2点会经历两遍。如果你刚好在切换日做定时任务或者排期要格外小心。我自己经历过一次自动化邮件任务固定在每天凌晨1点半触发偏偏遇到切换日美东从EDT切回EST当晚1点30分出现两次系统把邮件发了两遍订阅用户直接收到重复内容。这个问题在Java的TimeZone、Python的pytz和JavaScript的Day.js里都有各种边界案例最保险的写法是存UTC时间再用带时区库的接口计算下一次触发时间的UTC偏移。6. 跨时区实践换算公式、工具与日常避雷经验6.1 手动换算公式再也不用怕网络搜索时区换算本质上是一道加法题目标时间 已知本地时间 目标时区偏移 - 已知时区偏移。注意这里所有偏移都用UTC为参照正号表示东侧负号表示西侧。举个例子你在北京UTC8时间是周一上午10点想知道纽约若处于冬令时UTC-5几点。那就是10:00 (-5) - (8) 10:00 - 13 前一天的21:00。如果纽约处于夏令时UTC-4那10:00 (-4) - (8) 前一天的22:00。你发现了没有夏令时的影响会自动体现在偏移量里所以只要偏移对了加减法永远不会错。反过来也成立。美股开盘是美东9:30北京时间是9:30 (UTC8) - (UTC-5) 22:30。夏令时期间9:30 (8) - (-4) 21:30。对做中概股、美股交易的朋友来说记住冬令时22:30开盘夏令时21:30开盘比记住一堆缩写管用得多。6.2 我实际在用的时区工具清单现在推荐几个我长期在用的工具都不是什么冷门货但胜在稳定。系统自带的世界时钟手机、Windows、macOS都支持添加多个城市。我会固定加北京、东京、新加坡、伦敦、纽约、洛杉矶这6个城市一屏看完主要协作区。浏览器搜索time in city直接在搜索引擎输入time in New York结果页就是当地实时时间这个最不折腾开会前随手搜一下。日历邀请Google Calendar和Outlook都能识别时区。发会议邀请明确选时区America/New_York对方收到邀请后系统自动按他的时区展示。开跨国会议这是我认为最不容易出错的方式。时区转换网站如timeanddate.com它的Meeting Planner可以选多个城市直接给出大家都有空的时间段横向量会议排期非常好用。6.3 代码和系统里怎么存时间写程序的朋友尤其要养成一个习惯数据库一律存UTC不存本地时间。日志里同样输出UTC时间前端展示时再做本地化。JavaScript里getTimezoneOffset返回的是分钟数Python里timezone和zoneinfo处理起来也更顺手。如果只是做简单的世界时钟查询Python可以这样from datetime import datetime, timezone from zoneinfo import ZoneInfo # 获取当前UTC时间 now_utc datetime.now(timezone.utc) print(UTC:, now_utc.strftime(%Y-%m-%d %H:%M:%S)) # 换成纽约时间 now_ny now_utc.astimezone(ZoneInfo(America/New_York)) print(纽约:, now_ny.strftime(%Y-%m-%d %H:%M:%S %Z)) # 换成北京时间 now_bj now_utc.astimezone(ZoneInfo(Asia/Shanghai)) print(北京:, now_bj.strftime(%Y-%m-%d %H:%M:%S %Z))这里我特别想强调zoneinfo库的优势它直接内置了全球时区数据库和夏令时规则任何时区任何日期都会自动算对偏移不需要自己维护。旧代码里如果还在用pytz建议升级pytz的localize和normalize使用成本更高稍不留神就会踩错误的本地时间这种坑。6.4 跨时区协作中的四个雷区最后把这几年踩过和见过的跨时区雷区整理一下希望能帮你省下几杯咖啡的时间。第一不要只看缩写。CST、IST这种缩写真的会同时出现在北美、中国、古巴、印度、爱尔兰一定要求对方补一句UTC偏移或者至少补城市名。第二不要默认美国全境一个时间。美国本土四个时区东部和西部相差3小时如果你约的客户在旧金山按纽约时间算你的会议早了一小时。发邀请前先确认对方在哪个城市。第三不要忽略南半球的夏令时。澳洲、新西兰、南美一些国家在10月到次年4月实行夏令时恰好和北半球相反。你夏天去悉尼开会那边是冬令时但口号上它在标准时间别把对方说成夏令时错了全球实行的区域各有各的规则。第四不要用自己的手机时间换算。手机里显示的纽约时间是根据用户当前所在位置时区计算的如果你出差到了另一个时区手机显示会跟着变。开跨国会前最好在日历里确认会议事件本身的时区而不是只看手机屏幕上附带的小时区小字。7. 关于时区换算最后想分享的几个实用习惯时区问题看似小但在全球协作越来越普遍的今天栽跟头的人不在少数。我在实际使用中形成了一套自己的习惯分享给各位参考。第一任何口头约定的时间必须在后续消息里写成城市名当地时间UTC偏移三重格式。只写下午3点是不行的因为对方可能在多伦多、温哥华或墨西哥城。写北京时间下午3点UTC08:00任何人都无法误解。第二会议邀请一定要用带时区的日历系统发送不要用聊天工具里的明天下午4点这种话。因为日历系统会自动把邀请方的时区转成接收方的时区双方看到的都是自己的本地时间。如果你只是发消息说时间对方手机如果在另一个时区他就需要手动换算出错率很高。第三出行倒时差时我一般按当地时间调整作息而不是按自己身体的时区硬扛。到达后开窗晒太阳是调整生物钟最快的方法因为日光会抑制褪黑素分泌。到了当地立即按饭点进食、按夜间规律睡觉通常两天以内就能适应5小时以内的时差。真正要避免的是频繁在高时差区域之间往返身体会非常疲惫。第四常规做研发和运维的朋友日志时间戳务必用UTC但查看的时候要训练自己一口算出本地时间。我习惯在脑子里把UTC加8得到北京时间所以看到2024-11-04T04:30:00Z我第一时间就知道是当天12:30。这种UTC8的心算做熟了排查线上问题会快很多。时区这块没有深奥的高数但它处处考验细节。如果这一篇看完你还是觉得乱我的建议是不要记缩写只记UTC偏移不要记夏令时规则只用日历工具和时区库。把这两个原则贯彻到位全球时区基本不会再困扰你。
返回列表