local-time:todayとlocal-time:now

The local-time Manual

SQLを扱っていると日付を指定する事が往々にある。 Common Lispからそういうコードのユニットテストを行う場合local-timeライブラリを使っている。

が、このライブラリにある関数todayと関数nowは両方ともtimestampオブジェクトを返すがタイムゾーンが違っていて、関数todayはUTCで返し、関数nowはJSTで返る。(手元の環境では) timestampオブジェクトのままなら問題ないんだろうけど、SQLに日付を埋め込むために年月日の文字列に変換して使っていると、日本時間の0時から9時までは文字列は一致しなくなる。

そして、昼間はローカルで動いてたしCIのログもSUCCESSだから何かここ数時間でローカル環境を壊したはず、という可能性を考えて深夜に色々調査するも見つからず。。。

ちなみにそのユニットテストを通すだけなら、

(setf local-time:*default-timezone* local-time:+utc-zone+)

とかどこかでやって両方共UTCにしてしまえば通る。 たまたま0時を跨ぐとやっぱり失敗する分けだがそこは気にしないとして、どうするのが正しいか。