こんにちは!kossyです!
さて、今回は個人開発でLineBotをRailsを使って作成した時に、
Date.todayで日本時間が返らなかった時の備忘録を残してみたいと思います。
環境
Ruby 2.6.3
Rails 6.0.2
MacOS Mojave
config.active_record.default_timezoneの設定忘れ
単純なミスでした、、、
しかし、よく考えると時刻周りのconfigについて理解が曖昧だったので、調べてみました。
まずは公式ドキュメントをみました。
https://railsguides.jp/configuring.html
config.active_record.default_timezone:
データベースから日付・時刻を取り出した際のタイムゾーンをTime.local (:localを指定した場合)と
Time.utc (:utcを指定した場合)のどちらにするかを指定します。
デフォルトは:utcです。
ふむ、デフォルトはutcだったから日本時間が返らなかったんですね。
他にはどんな影響があるのでしょうか。
config.active_record.default_timezoneの設定はDBを読み書きする際に、DBに記録されている時間をTime.utcで読むかTime.localで読むかを設定する。
:utcの場合DBに記録されている時間はUTC扱いで、この時DBサーバのタイムゾーン設定は考慮しない。
ActiveRecordのインスタンスが持っているTimeWithZoneの値をUTCに変換し、その時刻をDBに書き込む。
:localの場合は、DBに記録されている時間はシステムのタイムゾーンとして扱う。
ActiveRecordのインスタンスが持っているTimeWithZoneの値をシステムのタイムゾーンに変換し、その時刻をDBに書き込む。config.active_record.default_timezoneは、DBのタイムゾーンと一致させておくべきだ。
DBのタイムゾーンがUTCなら:utcにDBのタイムゾーンがSYSTEMなら:localにしておく。新しくRailsのシステムを開発する場合は、DBのタイムゾーン設定とconfig.active_record.default_timezoneを合わせるように注意した方が良い。
もし、その設定に気付かず(忘れて)運用を開始してしまった場合は、MySQLのタイムゾーンの設定をUTCにした方が良いかもしれない。
上記の記事が詳しく説明されていました。
時刻周りに無知の状態でWebアプリを開発していたら、事故りますねこれ、、、
皆さんも同じ轍を踏まないよう、くれぐれもご注意ください。