サーバーの時計は、日本時間で動いていなかった。予約投稿が九時間出てこなかった話
公開の時刻を指定したのに、その時刻になっても記事が出てこない。
バグを探して一時間潰したあとで、時計のほうを見た。
ブログの記事を、朝の十時半に公開されるよう予約して入れた。
十時半になった。
開いてみると、ページがない。
十一時になっても、昼になっても出てこない。
入力を間違えたのかと思って中身を見に行ったが、日付も時刻も指定したとおりだった。
公開の状態にもなっている。
それでも出てこない。
原因は、僕の書いたものではなかった。
記事を置いているサーバーの時計が、まだ朝の一時半だと思っていた。
サーバーの多くは、日本時間で動いていない
パソコンやスマホの時計は、たいてい住んでいる場所に合わせてある。
日本にいれば日本時間だ。
サーバーはそうとは限らない。
世界中どこに置いてあっても同じ基準で動けるように、時差ゼロの時計を使うことが多い。
協定世界時と呼ばれるもので、UTC と略される。
日本時間はこれより九時間進んでいる。
日本の朝十時半は、UTC ではまだ前日の夜中の一時半だ。
なぜわざわざ時差のある時計を使うのかというと、そのほうが揉めないからだと思う。
ひとつのサービスを動かすのに、機械が一台だけということはあまりない。
記事を保存する機械、画像を配る機械、メールを出す機械が、別々の場所にあることもある。
それぞれが自分の国の時計で動いていたら、どれが先に起きたことなのか分からなくなる。
もうひとつ、夏時間がない。
国によっては年に二回、時計の針を一時間動かす。
その日は同じ時刻が二回来たり、来ないはずの時刻が飛ばされたりする。
UTC にはそれがないので、機械にとっては扱いやすい。
日時には、どこの時刻かが書かれていない
ここが分かりにくいところだった。
僕が入力した「2026年8月25日 10時30分」という日時は、データベースの中では文字と数字の並びとして保存されている。
そこに「これは日本時間です」という情報は入っていない。
書いてあるのは数字だけだ。
だから同じ数字を見ても、読む側の時計しだいで意味が変わる。
僕は日本時間の十時半のつもりで書いた。
サーバーは自分の時計と見比べて「まだ十時半になっていない」と判断した。
嘘をついているわけでも、壊れているわけでもない。
両方とも、自分の持っている物差しで正しく測っている。
ものさしの目盛りが同じで、ゼロの位置だけが違う。
こういうずれは、片方だけを見ているあいだは絶対に見つからない。
ずれは、境目でしか表に出ない
九時間もずれていたら、すぐ気づきそうなものだと思っていた。
ところが普段はほとんど表に出ない。
すでに公開されている記事は、いつ公開されたことになっていようと表示される。
新しく書いた記事も、公開の時刻を過去にしておけばすぐ出る。
困るのは、時刻そのものが判断に使われる場面だけだ。
予約して先の時刻を指定したとき。
掲載の終了時刻を決めたとき。
一日ごとの件数を数えたとき。
応募の締切を置いたとき。
つまり境目に来たときだけ、ずれが顔を出す。
そして境目というのは、たいてい大事な場面だ。
締切を過ぎているのに応募できてしまう、というのがいちばん怖い形だと思う。
直すより先に、どこを基準にするかを決める
時計は一箇所にあるわけではなかった。
サーバーそのものの時計、データベースの時計、記事を動かしているプログラム側の設定と、少なくとも三つある。
このうちどれかひとつだけを日本時間に直しても、残りとずれるだけで終わる。
やり方はだいたい二通りだと思う。
ひとつは、全部を日本時間で通すやり方。
日本の中だけで完結するサイトなら、これがいちばん分かりやすい。
画面に出ている時刻と、保存されている時刻が同じなので、後から調べるときに頭の中で足し引きしなくていい。
もうひとつは、保存はぜんぶ UTC でやって、画面に出すときだけ日本時間に直すやり方。
海外からも見られるサイトや、あとで別の国に広げるかもしれないものはこちらが向いている。
そのかわり、データベースを直接のぞいたときの数字は日本時間ではないので、そういうものだと覚えておく必要がある。
どちらでもいい。
よくないのは、片方をこっそり直して混ぜてしまうことだ。
僕は最初それをやりかけて、今度は「表示は合っているのに集計だけ前の日にずれる」という、もっと分かりにくい状態を作りかけた。
いま僕がやっていること
手元で試す環境と、実際に公開している環境で時計が違うので、そこは違うものとして扱うことにした。
手元で予約時刻を指定した記事が出てこないのは、壊れているのではなく九時間待っていないだけだ。
それを毎回不具合として疑い直すのをやめたら、確認が早くなった。
公開している側では、記事を入れたあとに実際のページを開いて、出るか出ないかを目で見る。
まだ時刻が来ていないなら出ないのが正しい。
出ないことを確認する、という言い方は変だが、これがいちばん確実だった。
時計がずれているというのは、機械の不具合というより物差しの取り違えに近い。
数字は合っているのに答えが合わない、というときは、たいてい数字ではなくその外側を疑ったほうが早い。
一時間潰して覚えたことの中では、これがいちばん役に立っている。
※運営者が個人で書いているnoteです。