数日前の退勤間際、1つ機能を実装してPull Requestを作って満足した気持ちで退勤しようとしていた。しかし作ったPRを見るとCIのテストが失敗している。どうやら失敗しているユニットテストがあるらしい。テストの結果を覗くと心当たりのない日付に関係するテストが失敗している……。月末だったら閏年の関係とか、そういうことも考えられるがまだ月末ではない。おかしいな、と思いつつ、明日に再実行したら成功するかも知れないし、ひとまず忘れて退勤した。
翌日、出社すると他のブランチでも漏れなくCIのユニットテストが失敗していることがわかった。これではリリースもできないので、ちゃんと調べて修正することにした。失敗しているテストを見るとタイムゾーンがUTC-3の場合のテストをしているようだった。指定されているロケールは America/Sao_Paulo
サンパウロ、ブラジルの都市だ。
最初に思いついたのはサマータイム。日本が秋から冬に差し掛かっているということは、南半球のブラジルは夏に差し掛かっているのだろう。ブラジルにサマータイムがあるのかどうか全く知らないので調べてみる。ブラジルにサマータイムはないらしい。予想が外れた。
同じタイムゾーンの別のロケールを指定してテストを実行してみる。同じUTC-3の America/Argentina/Buenos_Aires
を指定する。通った。
釈然としないが、UTC-3であることがテストの意図だったので全てブエノスアイレスに差し替えて修正PRを出した。午後にリリースするつもりだったので、とりあえずCIを通しておきたかった。
手元でデバッグをしてみてもサンパウロの場合はなぜかUTCからマイナス2時間になっている。不思議だ。
今回のオチ
社内のSlackチャンネルでこんなことがあったんですよと共有したところ、ブラジルは過去に夏時間があって2019年に廃止されてるようなのでその影響では、と指摘してもらった。
そしてプロダクトで使われているライブラリを確認すると最新でないので、使われているライブラリが古いためそのライブラリではブラジルはまだサマータイムがあることになっているのではと指摘してもらった。
日付ライブラリが最新ではなく、実際のサマータイムの制度と相違があるというのは思いつかなかった。自分の気が付かないところででサマータイムの廃止や採用がたまにあることや、ライブラリ側でその情報を持っているのでアップデートが必要なことあたりが学びになった。