2009-08-18 12 views
0

cronとscript/runnerを使用して実行するスケジュールされたジョブを持つRuby on Railsアプリがあります。Ruby/RailsアプリでTime.nowの動作が一貫していない

ジョブの目的は、延期された更新(「古い」、下記参照)を見つけ出し、(ジョブの実行後に)ジョブの「期日」を定義済みの分数に更新することです未来。

問題は私が 'due date'を設定すると、「GMT」時間が使用されることです。しかし、古いジョブを検索すると、「ローカル」時間が使用されているように見えます。サーバーの現地時間はGMTから-7時間ずれているため、更新の間隔は7時間延長されます。

例:ジョブの期日は、特定の日の06:00です。システムは、西海岸の06:00(7 GMT)の仕事を見つけます。ジョブが15分後に再度支払われる場合は、期日が06:15に設定され、オブジェクトの保存時(15分後と7時間後)に13:15に変更されます。

下記のコードを挿入します。違いがあれば、 'mark_updated'はモデルの一部であり、self.staleは同じモデルに含まれるモジュールのクラスレベル関数です。

ところで...ボーナス質問 - プロダクションのスクリプト/ランナージョブから実行されているSQLを取得するにはどうすればいいですか?これにより、デバッグが容易になります。私は何が起こっているのか少し推測しています。

def mark_updated 
    self.next_refresh_due_at = Time.now + update_interval_in_minutes.minutes 
    save 
end 

def self.stale(max = 3) 
    news_sources = NewsSource.find(:all, 
           :conditions => ["next_refresh_due_at < ?", Time.now], 
           :order => 'next_refresh_due_at ASC', 
           :limit => max) 

    return news_sources 
end 
+0

アプリサーバーがSQLサーバーと別の場合はありますか? – Chuck

+0

両方が同じサーバーにあります –

答えて

2

私はあなたのenvironment.rb設定ファイルで指定した時間帯を持っていると仮定しています。その場合はTime.nowの代わりにTime.zone.nowを使用してください。

詳しくは、this answerを参照してください。

+0

ああ!それがトリックでした。ありがとう - 私は昨夜、その髪を裂いていた。 –

関連する問題