問題と背景
- デプロイ先のサーバのタイムゾーンの設定は UTC となっている(本当はJSTにしておいて欲しかったが、今更サーバの設定を変更したくない)
- ただし whenever のスケジュール設定(config/schedule.rb)は日本時間で記述したい
- whenever の schedule.rb ではタイムゾーンを指定することができず、システムで設定されているタイムゾーンを使用する。
対応方法
- schedule.rb で時刻設定時にタイムゾーンを変換する関数を用意。その関数使って任意のタイムゾーンからシステムのタイムゾーンに変更する
# config/schedule.rb # Time クラスの拡張を利用するため ActiveSupport を require する require 'active_support/core_ext/time' # 時刻の文字列を日本時間で解釈して、システムのタイムゾーンに変換 def jst(time) Time.zone = 'Asia/Tokyo' Time.zone.parse(time).localtime($system_utc_offset) end # 日本時間の 午前 2:00 => UTC の 17:00 にバッチをスケジュール every 1.day, at: jst('2:00 am') do runner 'HogeFugaBatch.execute' end