🌏
RailsではDate.todayではなくTime.zone.todayを使おう
結論
-
Date.todayは、実行環境のタイムゾーンにおける当日の日付を取得する。 -
Time.zone.todayは、実行環境によらずRailsのconfig.time_zoneに設定されたタイムゾーンにおける当日を取得する。
→ 特別な理由がなければ Time.zone.today を利用した方が安全
Date.todayの利用が問題となる例
あるRailsプロジェクトで config.time_zone には Asia/Tokyo のタイムゾーンが設定されているが、サーバーの環境変数 TZ は指定しておらず、タイムゾーンがUTCとなっている。
その場合、当日の日付を取得する意図で Date.today を使うと、00:00〜8:59の間は、当日ではなく前日の日付が得られ、意図しない挙動になり得る。
→ 実際に、CI上でTZが指定されておらず、特定の時間帯だけ Date.today を利用しているテストが落ちるという現象に遭遇した。
改善策
-
config.time_zoneでタイムゾーンを指定する場合、サーバーの環境変数TZも同じように指定する。 - 仮に
TZが指定されていなくても問題ないよう、Railsでは基本的にDateやTimeを使わず、TimeWithZoneを使う。
Discussion