I4.08.4zone switch preserves past instants设计

用户切换所在时区后,已保存的过去记录不应随之改变显示的绝对时间点

别名: 换时区不改历史 · timezone change past records · 瞬间不变

概念解释

人从北京飞到伦敦,或在设置里改了时区,手表上的「现在」变了。已经存下来的过去记录,所指的那个瞬间不能跟着变:那条消息仍是当时发出的那一刻,订单仍是当时成交的那一刻。钟面可以改画成本地的新样子(北京 23:00 画成伦敦 16:00),但绝不能把记录改写成「伦敦 23:00」——那是另一个瞬间。对方现在几点,是协作呈现;这里只谈自己换区之后,历史坐标还在不在。

机制

过去记录若存的是瞬间,换区只改投影:同一瞬间,新的本地钟面。若存的是无区的本地数字,换区时系统会面临一次错误诱惑——把「15:00」继续显示成 15:00,等于把瞬间平移了八小时。人会以为自己下午三点发的消息变成了伦敦下午三点发出的,时间线、对账、时限全错位。正确的换区是:历史用瞬间不变、钟面重画;「现在」和尚未发生、按本地钟面理解的未来,才跟着新区走。

有人会希望「我看到的钟面别变」,那是在要求投影冻结,不是在要求瞬间跟着飞。若产品提供「始终用某城的钟面看历史」,那是固定呈现区,仍然对着原来的瞬间,不是改写记录。

边界

尚未发生、按「我的本地十点」理解的未来提醒,换区后通常应该改到新的本地十点,否则人会在新时区的凌晨被叫起来——那是未来规则,不是过去记录。正在进行的倒计时若绑的是绝对结束瞬间,换区只改钟面,剩余秒数不变;若绑的是「今天 18:00 本地」,换区等于改了结束瞬间,必须明确问人要不要改。日志导出给审计,有时要锁定导出时的呈现区,避免收件方再投影一次造成口头对不上;锁定的是画法,不是改瞬间。

怎么落地

  • 历史消息、订单、已完成的日程:换区后重画钟面,瞬间保持不变。不要把无区的「15:00」在新区里原样显示。
  • 若提供「用固定城市场景看历史」,固定的是呈现区,记录本身仍是瞬间。
  • 把未来的本地钟面规则和过去的瞬间分开处理,不要用同一套「跟着设置改」的代码。
  • 验证:记下一条历史记录的瞬间和当时钟面。改设备时区后再打开,钟面应换成新区的投影,倒推回 UTC 应得到同一瞬间。若钟面数字完全没变,瞬间已被平移,判失败。把一个「每天本地 7:00」的未来闹钟拿来对照:换区后应问清或改到新的本地 7:00,不应和历史记录走同一条路。

延伸

  • 同组I4.08.1 时间应以绝对标准时间存储,仅在呈现时转换为本地时区 · I4.08.2 跨夏令时边界的重复性事件需要重新计算本地时刻而非固定偏移 · I4.08.3 历史时区规则本身会随政治决定变化,跨年份的时间换算不能假设规则不变
  • 相邻I4.05 时区 · I3.06 状态持久化
  • 站内检索timezone change · preserve instant · rebasing local time

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/I4.08.4