2009-08-18 2 views
0

cron 및 script/runner를 사용하여 실행하는 예약 된 작업이있는 Ruby on Rails 앱이 있습니다.Ruby/Rails 앱에서 Time.now의 동작이 일관되지 않음

작업의 목적은 만기가 지난 ('부실', 아래 참조) 업데이트를 찾고 (작업 실행 후) 작업의 '만기일'을 미리 정의 된 시간 (분)으로 업데이트하는 것입니다. 미래.

문제는 내가 '만기일'을 설정할 때 "GMT"시간이 사용된다는 것입니다. 그러나 오래된 작업을 검색 할 때 '로컬'시간이 사용 된 것 같습니다. 서버의 로컬 시간은 GMT에서 -7 시간 오프셋이므로 시스템은 업데이트 사이에 7 여분의 시간이 소요됩니다.

예 : 작업의 만기 날짜는 특정 날짜의 06:00입니다. 시스템은 서쪽 해안 시간 06:00 (-7 GMT)에 작업을 찾습니다. 작업이 15 분 내에 다시 예정된 경우 '마감일'을 06:15로 설정하고 대상을 저장하면 (15 분 및 7 시간 후) 13:15로 변경됩니다.

아래 코드를 삽입 해 보겠습니다. 차이가 나는 경우 'mark_updated'는 모델의 일부이고 self.stale은 동일한 모델에 포함 된 모듈의 클래스 수준 함수입니다.

BTW ... 보너스 질문 - 프로덕션에서 스크립트/러너 작업에서 실행되는 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

아! 그것은 트릭을했다. 고마워요. 어젯밤에 저 머리를 찢어 버렸습니다. –

관련 문제