E2.14.2midnight-spanning interval设计
跨零点的时段需明确归属
别名: 跨夜时段 · overnight range · 24点归属
概念解释
「22:00–02:00」是跨过午夜的一段时间。人会问:这是今天夜里到明天凌晨,还是填反了?2:00 算结束日的凌晨还是开始日的下午?跨零点时段的归属(midnight-spanning interval)要求把这段时间钉在明确的日期上,并在界面上写出来。它管的是夜的两边属于哪一天,不是一档多少分钟,也不是 12 小时制的上午下午。
机制
一天被画成 0 到 24 的圆环,时段却是线性的。结束钟点小于开始钟点时,系统必须决定是「加一天」还是「用户填反了」。两者在数字上长得一样。夜班、航班、住宿的「含今夜」规则还不一样:酒店的一夜通常不含退房日的白天,夜班可能含次日 8 点。若不把日期写在钟点旁边,人用同一套数字在心里补不同的日历。零点本身也有歧义:24:00 是当天结束还是次日 00:00,同一瞬间两个标签。归属失败的典型后果是少算一天或订到反了的班次。
边界
完全落在同一日历日里的时段没有跨零点问题,硬加日期是噪声。全天事件(all-day)不走钟点,跨日用日期范围表达,不要再套 00:00–24:00 的钟点模型。时区切换时「当地午夜」会移动,跨零点要标明是哪一个当地日。循环班次(每周五 22:00 到周六 6:00)的归属是星期规则,单次日期控件不够用。
怎么落地
- 当结束钟点早于开始钟点时,显式标出结束属于次日,例如「22:00 → 次日 02:00」,不要只显示两个钟点。
- 在提交前用自然语言重述区间(「今夜 10 点到明早 2 点,共 4 小时」),让归属被听见。
- 区分「填反了」与「合法跨夜」:提供「跨夜」确认,而不是一律报错结束必须晚于开始。
- 验证:订一个跨夜班或跨夜住宿,问结束发生在哪一天、一共几个小时。答错或要心算日期,归属就还没写在界面上。再试 00:00 与 24:00 是否被当成同一瞬间。