日期边界测试:DST/闰年/月末的 bug 预防清单
背景与问题
时间相关 bug 不在平常值、全部聚集在边界——DST 切换、闰日、月末、年越。日本无 DST 感觉不到,但出海欧美(美/欧 DST:2026 年 3-08→11-01)后是必炸的雷。预防清单化。
发现
(来源访问日期均为 2026-09-20 访问)
- 事实(Microsoft Azure):闰年 bug 的解法=「mock the clock」——系统时钟を模拟して実際の闰日を待たずにテスト。
- 事实(NashTech 2026):時間系 defect は境界値に集中する——平常日付のテストでは見つからない。
- 事实(DST 対処の定石):①保存は常に UTC ②表示時のみローカル変換 ③固定オフセットでなく IANA タイムゾーン ID(America/New_York)を使う ④DST 切替は明示処理。
- 事实(NIST):米 DST 公式日=2026 年 3 月 8 日→11 月 1 日——「spring forward」の 2:00-2:59 は存在せず、「fall back」は同時刻が 2 回来る。
- 事实(実例 war story 2026):決済照合システムが閏日に崩壊した事例——カレンダーライブラリを使い月末日を動的計算、365/31 のハードコード禁止が教訓。
- 推测:日本在住 solo の DST バグは「3 月と 11 月にしか出ない」——しかし米国ユーザーのリマインダー/集計がその 2 日だけ壊れる。年 2 回の定期点検日としてカレンダーに入れるのが最安の防御。
結論
- テスト四境界:①DST 切替日(米 3 月第 2 日曜/11 月第 1 日曜)②閏日(2-28→29→3-01)③月末切替(1-31→2-01 等)④年越し/ISO 週番号——各 1 テストケースを常設。
- コード規約三条:保存 UTC・IANA ID・ハードコード日数禁止(カレンダーライブラリ経由)——新規コードのレビュー観点に追加。
- 年 2 回の点検日:3 月第 2 日曜前と 11 月第 1 日曜前に cron/リマインダー系を走查(opc-release-precheck-5min の季節版)。
- mock the clock をユニットテストに導入:時刻を固定注入できる設計にしておけば、上記全部が自動化される。
待办 / 下次继续
关联
opc-cron-design-minimum opc-release-precheck-5min japan-timezone-advantage