2010-09-09 6 views
2

J'ai un problème très étrange avec l'heure d'été (DST) dans mon application. Pour une raison quelconque, chaque fois que je reçois un temps de la table, il ne s'ajuste pas lui-même pour l'heure d'été. Par exemple, si je crée un nouvel horaire dans la console, dans le fuseau horaire approprié, l'écris dans la base de données, puis essaie de le récupérer dans la base de données, il revient une heure plus tôt.L'heure d'été n'est pas correctement calculée dans Rails 2.3.5?

Voici un exemple:

Ici, nous pouvons voir que l'utilisation de la console, ce qui crée une nouvelle heure à 15h00 HNE est égal à 19:00 UTC (depuis réglé pour l'heure d'été, ce qui le rend -0400 au lieu de l'habituel -0500):

ruby-1.8.6-p114 > Time.zone 
=> #<ActiveSupport::TimeZone:0x12b1b68 @name="UTC", @tzinfo=nil, @utc_offset=0> 
ruby-1.8.6-p114 > Time.zone = "Eastern Time (US & Canada)" 
=> "Eastern Time (US & Canada)" 
ruby-1.8.6-p114 > Time.zone.parse("15:00") 
=> Thu, 09 Sep 2010 15:00:00 EDT -04:00 
ruby-1.8.6-p114 > Time.zone.parse("15:00").utc 
=> Thu Sep 09 19:00:00 UTC 2010 
ruby-1.8.6-p114 > Time.zone.parse("15:00").dst? 
=> true 

maintenant, j'essaie d'écrire en même temps que la base de données, et le récupérer en arrière:

ruby-1.8.6-p114 > b = Book.new 
=> #<Book id: nil, return_time: nil, created_at: nil, updated_at: nil> 
ruby-1.8.6-p114 > b.return_time = Time.zone.parse("15:00") 
=> Thu, 09 Sep 2010 15:00:00 EDT -04:00 
ruby-1.8.6-p114 > b.save 
=> true 
ruby-1.8.6-p114 > result = Book.find(:last).return_time 
=> Sat Jan 01 19:00:00 UTC 2000 
ruby-1.8.6-p114 > result.zone 
=> "UTC" 
ruby-1.8.6-p114 > result.in_time_zone 
=> Sat, 01 Jan 2000 14:00:00 EST -05:00 
ruby-1.8.6-p114 > result.dst? 
=> false 

Mon environment.rb a ceci:

config.time_zone = 'UTC' 

Et application_controller.rb a ceci:

before_filter :set_user_time_zone 

def set_user_time_zone 
if current_user 
    Time.zone = current_user.time_zone 
else 
    Rails.logger.error '[Time.zone.now.to_s][ERROR]: Missing current_user from in set_user_time_zone!' 
end 

fin

Toutes les idées sur ce qui pourrait se produire ici et comment y remédier? Cela fait des jours que je suis là-bas, alors vraiment, toute aide serait grandement appréciée!

Merci beaucoup.

Répondre

5

Il semble que vous économisiez seulement la partie temps; notez comment la partie date va de Thu, 09 Sep 2010 à Sat, 01 Jan 2000. Puisque le calcul de l'heure d'été dépend de la date, c'est probablement là que vous perdez l'information. (Le 1er janvier n'est pas en heure d'été, donc en supposant cette date, le calcul de l'heure d'été est correct). Vous devez probablement enregistrer un DATETIME dans la base de données, pas seulement TIME.

+0

Vous avez absolument raison Phil, merci beaucoup! :) – michaeldwp

+1

Même problème ici, mais je ne peux pas passer à datetime puisque je ne suis intéressé que par le temps, je veux pouvoir interroger tous les enregistrements qui ont le temps après par exemple 13:00. Si je passe à datetime je ne peux pas faire ça. – iwiznia

1

Je ne suis pas sûr de la version de Rails que vous utilisez, mais j'ai eu le même problème en 2.1.2. Il semble que la bibliothèque de fuseaux horaires ne fonctionne tout simplement pas la moitié de l'année, mais les développeurs ne pensaient pas que cela valait la peine de changer; J'espère qu'ils ont repensé cette décision maintenant. Dans tous les cas, nous avons fini par utiliser le plugin tzinfo_timezone, qui calcule correctement les décalages UTC pendant l'heure d'été.

+0

Merci beaucoup pour le conseil. J'ai regardé dans le code Rails pour essayer de comprendre ce qui se passait, et ça ressemble à la version 2.3.5 (la version que j'utilise) qui utilise déjà tzinfo. Le problème s'est avéré être ce que Phil a dit: quand la valeur Time est sauvegardée dans la table, la date est changée au 1er janvier 2000, ce qui n'est pas dans DST ... argh! C'est réglé maintenant, merci! – michaeldwp

Questions connexes