2009-08-18 6 views
0

J'ai une application Ruby on Rails qui a un travail planifié que j'exécute en utilisant cron et script/runner. Le but du travail est de trouver les mises à jour qui sont en retard ('périmé', voir ci-dessous) et (après l'exécution du travail) mettre à jour la 'date d'échéance' du travail un nombre prédéfini de minutes dans l'avenir. Le problème que j'ai est que lorsque je définis la 'date d'échéance', l'heure "GMT" est utilisée. Cependant, quand je cherche des emplois périmés, le temps «local» semble être utilisé. L'heure locale du serveur est décalée de -7 heures par rapport à GMT, de sorte que le système passe 7 heures supplémentaires entre les mises à jour. Exemple: La date d'échéance du travail est 06h00 un certain jour. Le système trouve ce travail à 06h00 heure de la côte ouest (-7 GMT). Si le travail est dû à nouveau dans 15 minutes, il définit la «date d'échéance» à 06:15 qui est changé à 13h15 lorsque l'objet est enregistré (15 minutes et 7 heures dans le futur).Comportement incohérent de Time.now dans l'application Ruby/Rails

Je vais insérer le code ci-dessous. Si cela fait une différence, 'mark_updated' fait partie d'un modèle et self.stale est une fonction de niveau classe dans un module inclus dans le même modèle.

BTW ... question de bonus - comment obtenir attraper le SQL qui est exécuté à partir du travail de script/runner dans la production? Cela faciliterait le débogage. Je devine un peu ce qui se passe.

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

Est-il possible que le serveur d'applications soit distinct du serveur SQL? – Chuck

+0

Ils sont tous les deux sur le même serveur –

Répondre

2

Je suppose que vous avez le fuseau horaire spécifié dans votre fichier de configuration environment.rb. Dans ce cas, vous devez utiliser Time.zone.now au lieu de Time.now.

Voir this answer pour une explication complète.

+0

Ah! Cela a fait l'affaire. Merci - Je me suis arraché les cheveux la nuit dernière sur celui-là. –

Questions connexes