web-dev-qa-db-fra.com

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

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
101
Tom Lehman

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)')
185
Steve Weet

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

17
opsidao

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

8
Eifion

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.

2
nitecoder

Si vous configurez votre /config/application.rb

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

Time.now.in_time_zone

DateTime.now.in_time_zone
2
Dorian