I4.04.2refreshing relative timestamps设计

相对时间需要刷新才准确

别名: 相对时间过期 · stale time ago · 时间标签刷新

概念解释

「刚刚」「三分钟前」「昨天」都是相对于现在说的。现在在走,标签不走,句子就会从真变成假。相对时间需要刷新指界面按粒度把这些标签重新计算:秒级的过几秒就要变,分钟级的过一分钟就要变,跨过午夜「今天」要变成「昨天」。选相对还是绝对是上一层的问题;这里假定已经用了相对,只谈它怎样才继续是对的。

机制

相对标签是一个随时间漂移的函数,不是写死的字符串。粒度越细,漂移越快:「刚刚」在大约一分钟内为真,「5 分钟前」在下一分钟就该变成「6 分钟前」。若不重算,列表会停在打开那一拍的「现在」上——人离开去倒杯水回来,时间线还说这些消息是刚刚,和感知冲突。

还有一类边界是日历边界,不是均匀流逝。本地午夜一过,「今天 22:00」变成「昨天」,「昨天」变成日期。只按「每 60 秒加一分钟」去刷,会漏掉这一跳。页面被后台冻结时,定时器不走,回到前台的第一件事应是用当前时刻重算全部可见相对标签,而不是接着过期的钟走。

边界

已经换成绝对时间的位置(归档、对账单、详情里的完整时刻)不需要这套刷新,硬刷只会制造闪烁。不可见的长列表不必为每一行开一只秒级定时器,刷到视口里再算。读屏若把每一次「n 分钟前」的跳变都朗读出来,刷新本身会变成噪音,应对已读过的静态区域静默,或改到较粗的粒度。法律意义上的「发生时刻」不能靠相对刷新来表达——刷新改正的是距离描述,不是事件本身的坐标。

怎么落地

  • 按粒度设刷新:秒 / 分钟级标签在可见时定期重算;小时和「昨天」至少在回到前台和跨午夜时重算。
  • 从后台回到前台、跨过本地午夜,立刻重算当前视口,不要等下一只定时器。
  • 只刷新可见行;不要对已改为绝对时刻的字段做相对重算。
  • 验证:停留在一条显示「刚刚」的时间线上超过粒度间隔,标签应推进。把系统时间拨过午夜,原「今天」应变成「昨天」或日期。切到别的应用若干分钟再回来,第一眼的相对标签应已经按新的「现在」算过,而不是停留在离开前。

延伸

  • 同组I4.04.1 相对时间适合近期,绝对时间适合追溯 · I4.04.3 精确时间应在悬停或详情中可得
  • 相邻S2.01 日期与时间格式 · I4.03 轮询与推送
  • 站内检索relative time refresh · stale time ago · midnight rollover

同组卡片

快捷操作

分享

分享当前页面

ios_share

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