RailsでTime.nowが日本時間にならないときはTZを確認しましょう
RailsでTime.nowが日本時間にならないときはTZを確認しましょう
2020/02/29

DockerでRailsの開発を作成した際に、Time.nowが日本時間になってくれず困ったので備忘録。

結論、サーバーのタイムゾーンがUTCのままだったので環境変数TZを設定することで解決しました。

Time.nowが日本時間になってくれない!?

現在の時刻が22:38ですが、rails上でUTC時刻になってしまいます。

> Time.now
=> 2020-02-29 13:38:34 +0000

config/application.rbconfig.time_zone = 'Tokyo' を記載していても、Time.nowには反映されません。

なぜなら、config/application.rbの設定はTimeWithZoneというメソッド(Time.zone.nowなど)に効果があり、Time自体はRailsの設定に影響されないためです。

なので、config/application.rb の設定だけでは、以下のようにTime.zone.nowTime.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.nowTime.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の設定上で動くので良いそうです。