Torihaji's Growth Diary

Little by little, no hurry.

RailsでDBで保存されている日付とレスポンスされてきたJSONの日付がなんか違う時

はじめに

どうも、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っす。

終わりに

レスポンスも正常になったのでよかったよかった。

とにかくタイムゾーンを疑いましょう。