DockerでRailsの開発を作成した際に、Time.nowが日本時間になってくれず困ったので備忘録。
結論、サーバーのタイムゾーンがUTCのままだったので環境変数TZを設定することで解決しました。
Time.nowが日本時間になってくれない!?
現在の時刻が22:38ですが、rails上でUTC時刻になってしまいます。
> Time.now
=> 2020-02-29 13:38:34 +0000
config/application.rb
に config.time_zone = 'Tokyo'
を記載していても、Time.nowには反映されません。
なぜなら、config/application.rb
の設定はTimeWithZoneというメソッド(Time.zone.nowなど)に効果があり、Time自体はRailsの設定に影響されないためです。
なので、config/application.rb
の設定だけでは、以下のようにTime.zone.now
とTime.now
で結果が変わってしまう。
> Time.zone.now
=> Sat, 29 Feb 2020 22:40:13 JST +09:00
> Time.now
=> 2020-02-29 13:40:20 +0000
Time.now
はサーバーのタイムゾーンを参照しており、Time.zone.now
はRailsのタイムゾーンを参照しているためである。
このままでは、不具合が出る可能性が高くなってしまうので、サーバーのタイムゾーンもRailsのタイムゾーンに合わせましょう。
サーバーのタイムゾーンを日本時間に変更
Dockerfileに環境変数を設定しました。
ENV TZ Asia/Tokyo
DockerComposeを使っている場合は、docker-compose.ymlに環境変数を設定してもよいでしょう。ただ一度設定したら変えるものでもないので、Dockerfileに記載する方がスッキリすると思います。
services:
rails:
environment:
TZ: Asia/Tokyo
コンテナをビルド&再起動するのを忘れずに。
チェック
無事、Time.zone.now
とTime.now
で同じ結果となりました。
> Time.zone.now
=> Sat, 29 Feb 2020 23:08:52 JST +09:00
> Time.now
=> 2020-02-29 23:08:55 +0900
P.S.
RailsではTimeWithZoneを使った方がRailsの設定上で動くので良いそうです。