その他
    ホーム 技術発信 DoRuby wheneverで時刻を設定する際システムで設定されているのとは別のタイムゾーンを使用する
    wheneverで時刻を設定する際システムで設定されているのとは別のタイムゾーンを使用する
     

    wheneverで時刻を設定する際システムで設定されているのとは別のタイムゾーンを使用する

    この記事はアピリッツの技術ブログ「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
    

    参考

    記事を共有