109 votes

Convertir l'heure d'un fuseau horaire en un autre dans Rails

Mes horodatages created_at sont stockés au format 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
 

193voto

Steve Weet Points 15395

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)')
 

17voto

opsidao Points 443

Même si c'est une vieille question, il convient de mentionner quelque chose. Dans une réponse précédente , il est suggéré d'utiliser un before_filter de régler le fuseau horaire dans le temps.

Vous devriez jamais le faire parce que le Temps.la zone stocke les informations dans le fil, et il sera probablement de fuite à la prochaine requête gérée par le thread.

Au lieu de cela, vous devez utiliser une around_filter pour s'assurer que le Temps.la zone est réinitialisée après que la demande est complète. 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

Lire plus à ce sujet ici

9voto

Eifion Points 2471

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é.

4voto

Dorian Points 2384

Si vous configurez votre /config/application.rb

 config.time_zone = 'Eastern Time (US & Canada)'

Time.now.in_time_zone

DateTime.now.in_time_zone
 

2voto

nitecoder Points 4561

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X