light log

学んだこととか

Railsのタイムゾーン

Railsアプリを試しに作っていて、今日はタイムゾーンで少しハマって調べたのでメモ。

構成はこの通り。

タイムゾーンいろいろ

まず、Railsアプリを作ってるときに関係するタイムゾーン複数ある。

デフォルト

タイムゾーンのデフォルト値。

Railsアプリ

下のコメントは、デフォルトで生成されるconfig配下のapplication.rbの抜粋。

config/application.rb

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'

デフォルトはUTCと書いてある。

DB

DBのタイムゾーンは、config.active_record.default_timezoneで設定できる。

Railsガイドによると、

config.active_record.default_timezoneは、データベースから日付・時刻を取り出した際のタイムゾーンをTime.local (:localを指定した場合)とTime.utc (:utcを指定した場合)のどちらにするかを指定します。デフォルトは:utcです。

Rails アプリケーションを設定する — Rails ガイド

よってデフォルトはUTC

設定する

アプリ内ではJSTにして、DBにはUTCで格納したい。

そうするには以下の一行を足すだけでできた。

config/application.rb

config.time_zone = 'Tokyo'

まとめ

まだまだ勉強として簡単なアプリを作っているだけで、国際化とかを考えるには早いけど、こういうことを意識しておくのも大事だと思う。

ちなみに、configを直したらサーバの再起動が必要。いつも忘れがちになる。今日も忘れていて、ちょっとした時間をロスした。

あとどうでもいいけど、なんでconfig.time_zoneは"time_zone"で config.active_record.default_timezoneは"timezone"なんだ。もしや_でつなぐ単語は2つって決まってるのかと思ってガイドを見たらすぐにconfig.action_view.cache_template_loadingとかあった。なんなんだろう。

参考