はじめに
どうも、torihaziです
今日は気にしなくていいかもしれないけど
気にする人は気にしそうだったので仕方なく調べました。
何が起きたの。
DBでは
2025-03-25 15:00:00
と保存されているのに、Rails APIモードで出力したJsonには
2025-03-26T00:00:00.000+09:00
となんか1日進んじゃっていたという事象。
結論
タイムゾーンの違い。
DBには「2025-03-25 15:00:00」という形式でUTCタイムゾーンで保存される。
で今回、アプリケーションのタイムゾーンはconfig.time_zone = 'Tokyo'で東京時間(UTC+9)に設定されてた。
そこからUTCの15:00に9時間を足すと翌日の00:00(15:00 + 9:00 = 24:00 = 翌日の00:00)
そのため「2025-03-25 15:00:00 UTC」は「2025-03-26 00:00:00 JST」と同じ時刻。
Railsは日時データをJSONに変換する際、ISO 8601形式(YYYY-MM-DDThh:mm:ss.sss+TZ)を使用する。
そのため最終的に「2025-03-26T00:00:00.000+09:00」という形式になる。
Railsでは、明示的に設定されていない場合:
config.active_record.default_timezone = :utcがデフォルトで、DBにはUTCで保存される。
JSONシリアライズ時にはconfig.time_zoneで設定されたタイムゾーン(この場合は東京時間)に変換される。
つまり、同じ時刻を表していますが、タイムゾーンの変換により日付が変わって見えちゃったということ。
解決策
Railsのアプリケーション側では time_zone = 'Tokyo'してたので
DBの方もTokyoのタイムゾーンになるようにする。
ということで config/application.rbにおいて下記を追記。
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local <= これね
これでokっす。
終わりに
レスポンスも正常になったのでよかったよかった。
とにかくタイムゾーンを疑いましょう。