I4.08.2DST-aware recurring events设计

跨夏令时边界的重复性事件需要重新计算本地时刻而非固定偏移

别名: 重复事件夏令时 · recurring DST · 本地钟面规则 · wall time recurrence

概念解释

「每周二上午十点」说的是那座城市墙上的十点,不是「第一次开会那个瞬间加上七天」。跨夏令时边界的重复事件要按本地钟面重算:进入或离开夏令时的那一周,十点对应的绝对瞬间会跳一小时;若存的是固定的 UTC 偏移,墙上会变成九点或十一点,人却还以为自己约的是十点。钟面在切换夜不连续,是另一层的困惑;这里只谈重复规则在边界上怎么展开成一次次发生。

机制

重复规则有两种展开方式。一种把首次发生的绝对瞬间加上固定间隔(七个 24 小时),偏移被冻在第一次里。夏令时把本地日变成 23 或 25 小时,冻住的间隔不再对准墙上的十点。另一种每次用「时区 + 本地钟面 + 日期」重新求瞬间,十点仍然是十点,瞬间自己去跳。人约的是墙上的格,不是地球自转的固定秒数,所以展开必须走第二种。

边界上还会碰到空洞和重叠:春天没有十点之前的某个钟点,秋天某个钟点出现两次。重算不是把这些格抹掉,而是按规则表选出合法的那一次瞬间(通常是「仍用本地十点,落到转换后的偏移上」),并在无法落下时拒绝或改到最近的合法格,而不是沿用转换前的偏移硬加七天。

边界

只发生一次的事件没有「重复展开」,存瞬间即可,不必当重复规则处理。按绝对间隔重复的提醒(每 24 小时服药,不管墙上几点)就应该用固定间隔,重算本地钟面会破坏剂量节奏。跨多个时区的系列(全球全员会)没有一座共同的墙,需要先定「以哪一个区的钟面为准」,或改成「每人自己的十点」这种按参与者展开。规则表缺了那一年的夏令时数据,重算会静默用错偏移,错误看起来像固定偏移的老毛病,其实是表旧了。

怎么落地

  • 存重复规则时同时存:时区标识、本地钟面(周二 10:00)、重复周期。每次展开用当时的规则表求该次的瞬间。
  • 不要把「下一次 = 上一次瞬间 + 7×24h」当作跨夏令时区的默认。
  • 展开落到空洞或重叠时,按产品规则选择合法瞬间或要求人确认,不要沿用旧偏移。
  • 验证:在实行夏令时的时区建一个「每周二 10:00」的系列,让系列跨过春季转换。转换后那一次的本地钟面应仍是 10:00,绝对瞬间应相对前一周跳开一小时。用固定 UTC 展开的对照里,本地钟面应错成 9:00 或 11:00。每 24 小时的服药提醒不应跟着钟面重算。

延伸

  • 同组I4.08.1 时间应以绝对标准时间存储,仅在呈现时转换为本地时区 · I4.08.3 历史时区规则本身会随政治决定变化,跨年份的时间换算不能假设规则不变 · I4.08.4 用户切换所在时区后,已保存的过去记录不应随之改变显示的绝对时间点
  • 相邻I4.05 时区 · I4.06 倒计时与时限
  • 站内检索recurring DST · wall time · timezone identifier

同组卡片

快捷操作

分享

分享当前页面

ios_share

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