Ma created_at
les horodatages sont stockés en UTC:
>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
Comment convertir l'un d'entre eux en "heure de l'Est (États-Unis et Canada)" (en tenant compte de l'heure avancée)? Quelque chose comme:
Annotation.last.created_at.in_eastern_time
Utilisez la méthode in_time_zone de la classe DateTime
Loading development environment (Rails 2.3.2)
>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit
Donc, pour votre exemple particulier
Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)')
Bien que cette question soit ancienne, il convient de mentionner quelque chose. Dans un réponse précédente , il est suggéré d'utiliser un before_filter pour définir le fuseau horaire temporellement.
Vous devriez ne jamais, jamais le faire, car Time.zone stocke les informations dans le fil, et il y aura probablement une fuite vers la prochaine demande traitée par ce fil.
Au lieu de cela, vous devez utiliser un filtre around_filter pour vous assurer que le Time.zone est réinitialisé une fois la requête terminée. Quelque chose comme:
around_filter :set_time_zone
private
def set_time_zone
old_time_zone = Time.zone
Time.zone = current_user.time_zone if logged_in?
yield
ensure
Time.zone = old_time_zone
end
En savoir plus sur ceci ici
Si vous ajoutez ceci à votre /config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Ensuite, vous pouvez cellulaire
Annotation.last.created_at.in_time_zone
pour obtenir l'heure dans le fuseau horaire spécifié.
Réglez votre fuseau horaire sur l'heure normale de l'Est.
Vous pouvez définir votre fuseau horaire par défaut dans config/environment.rb
config.time_zone = "Eastern Time (US & Canada)"
Désormais, tous les enregistrements que vous extrayez seront dans ce fuseau horaire. Si vous avez besoin de fuseaux horaires différents, par exemple, en fonction du fuseau horaire de l'utilisateur, vous pouvez le modifier avec un before_filter dans votre contrôleur.
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
Time.zone = current_user.time_zone
end
end
Assurez-vous simplement que vous stockez tous vos temps dans la base de données au format UTC et tout ira bien.
Si vous configurez votre /config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Time.now.in_time_zone
DateTime.now.in_time_zone