ある朝、予約システムを使ってくれている方から連絡が来た。「イベントが、全部消えています」。
管理画面で見ると、登録したイベントはちゃんと残っている。なのに、お客様の画面には一つも出てこない。受付中のはずのイベントが、まるごと「もう終わったもの」として扱われていた。
全部が「過去」になっていた
調べていくと、原因は日付の比較にあった。
その日以降のイベントだけを表示する、という処理を入れていた。今日の日付と、イベントの日付を比べて、未来のものだけ出す。考え方はまっとうだ。けれど、その「比べる」が間違っていた。
日付を、文字列のまま比べていたのだ。
「2026-06-22」と「2026/06/22」
入力フォームから来る日付は、「2026-06-22」という形だった。ハイフン区切り。一方、システムの中で今日を表すときは、「2026/06/22」というスラッシュ区切りを使っていた。
人間の目には、どちらも同じ六月二十二日だ。だが、文字列として比べると、話が変わる。コンピュータは文字を、その文字コードの順で比べる。そして「-」は「/」より、コード上で小さい。
つまり「2026-06-22」は、「2026/06/22」より小さい——常に過去、と判定される。区切り文字が違うだけで、すべてのイベントが今日より前、ということになっていた。
一文字の違いが、全部を倒す
ぞっとした。ロジックは正しい。日付の中身も正しい。なのに、区切り文字という、ふだん意識もしないところで、全部が倒れていた。
直し方そのものは小さい。保存するときに「-」を「/」へそろえ、読むときも日付として扱う。フォーマットを、入口と出口で必ず統一する。それだけだ。
境界で、形をそろえる
このバグは、一つのシステムの中だけでは起きなかった。
入力フォームという外側と、システムの内側。二つの世界が触れる境目で、日付の形が違っていた。片方はハイフン、片方はスラッシュ。それぞれの中では一貫していたのに、つなぎ目で食い違った。
不具合は、たいていこういう境目に住んでいる。だから、外から来たものを受け取る入口で、いったん自分の形にそろえる。出ていく出口でも、相手の形に直す。境界を越えるたびに、形を整え直す。そう決めてから、この手の食い違いは、ずいぶん減った。
日付は、文字列で比べない
この件で、自分の中に一つルールができた。日付は、文字列のまま比べない。
比べるなら、数値か、日付の型に直してから。表示のために文字列にするのはいい。けれど、大小を判定する瞬間だけは、文字の並びではなく、本当の日付として扱う。区切り文字や桁の有無に、判定を預けない。
派手なバグではない。エラーも出ない。ただ静かに、全部が過去になる。こういう「動いているように見えて、全部間違っている」たぐいが、いちばん怖い。だから日付を比べる場所を見つけるたび、今でも一度、手を止めて確かめる。