RailsにおいてDate.todayで日本時間が返らない原因を探った話

こんにちは!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です。

引用: https://railsguides.jp/configuring.html


ふむ、デフォルトは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にした方が良いかもしれない。

引用: https://qiita.com/joker1007/items/2c277cca5bd50e4cce5e

上記の記事が詳しく説明されていました。

時刻周りに無知の状態でWebアプリを開発していたら、事故りますねこれ、、、


皆さんも同じ轍を踏まないよう、くれぐれもご注意ください。