この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Railsアプリケーションのバッチ処理を [whenever](https://github.com/javan/whenever) でスケジュール設定する際、デプロイ先のタイムゾーンの設定がUTCなんだけど、スケジュール設定は開発者にわかりやすく日本時間としたいケースがあったので、その対応方法について。
問題と背景
- デプロイ先のサーバのタイムゾーンの設定は 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