考慮すべきタイムゾーンは以下の4つ
- Rubyプロセス
-
Time.now
等に影響
-
- config.time_zone
-
Time.zone.now
等に影響
-
- config.active_record.default_timezone
- DBから受け取った時刻をどのタイムゾーンとして解釈するか
- DB
- SQL文の
NOW()
等に影響
- SQL文の
Rubyプロセス
開発環境(Docker)
Dockerfile
にENV TZ Asia/Tokyo
を追加して対応
本番環境
環境変数にTZ = Asia/Tokyo
をセットして対応
config.time_zone
共通
config/application.rb
config.time_zone = 'Tokyo'
config.active_record.default_timezone
共通
config/application.rb
config.active_record.default_timezone = :local
DB
開発環境、本番環境それぞれのDBに接続し、以下のクエリを実行
ALTER DATABASE db_name SET timezone TO 'Asia/Tokyo';
Postgresの場合の書き方なので、DBの種類によっては書き方が違うかも。
DBに再接続すると反映されています。
rails:db:migrate
を実行するとタイムゾーンも元に戻ってしまいますが、そもそもRailsでSQL文を書くことも少ないのでまあ良いでしょう。
docker-compose.ymlに環境変数を設定する方法もあるみたいですが、うまくいきませんでした。