Rails: convertir l'heure UTC en un autre fuseau horaire


Réponses:


206
time.in_time_zone(time_zone)

Exemple:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

ou juste

Time.now.in_time_zone("Central Time (US & Canada)")

Vous pouvez trouver les noms des fuseaux horaires ActiveSupport en procédant comme suit:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)

Dans irb, quand j'essaye Time.now.in_time_zone ('CST'), j'obtiens l'erreur "méthode indéfinie 'in_time_zone'". Y a-t-il des classes de rails dont j'ai besoin pour que cela fonctionne?
Drew Johnson

Quelle version de Rails utilisez-vous? Cela fonctionne-t-il si vous faites Time.zone.now.in_time_zone (...)?
mckeed

13
Pour utiliser ceci à l'extérieur des rails, d' require 'active_support/time'abord.
sunaku

3
Vous pouvez lister tous les fuseaux horaires en exécutant rake time:zones:all. Voir aussi rake -D time. Définissez le fuseau horaire par défaut dans config/application.rb.
user664833

1
@AdamEberlin Dans Rails, vous utilisez généralement ActiveSupport :: TimeWithZone, pas DateTime. Tout ce code fonctionne sur les objets Ruby DateTime ainsi que sur les objets Time.
mckeed

6

si Time.zonec'est votre fuseau horaire souhaité, vous pouvez utiliser@date.to_time.to_datetime

> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100 

Ne fonctionne pas sur Rails 5 `Time.zone # => Europe / Paris my_date # => mer, 29 mars 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => mer, 29 mars 2017 17:00:20 +0000`
Cyril Duchon-Doris

5

En rubis uni, avec seulement require 'date', utilisez la new_offsetméthode:

require 'date'

d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"

Testé avec ruby ​​2.3.7 fourni en standard sur Mac OS X 10.13.


3

Essayez les objets TimeWithZone d' ActiveSupport manipulés avec TimeZone. ActiveSupport fournit également la méthode in_time_zone pour convertir une heure UTC en un fuseau horaire spécifié. La réponse de mckeed montre le code.


Quelle est la syntaxe pour importer TimeWithZone dans ma classe? Ou est-ce que je l'obtiens par défaut avec Rails?
Drew Johnson

1
Je crois que vous l'obtenez par défaut. mckeed a le code dont vous avez besoin, mais vous ne le verrez pas dans irb. Vous devez l'exécuter dans Rails.
Fred

Vous avez raison - merci, Fred - il est livré avec Rails par défaut. J'attrapais des pailles, essayant de le faire fonctionner en irb.
Drew Johnson

3

Juste au cas où, si vous avez affaire à un objet ActiveRecord dans Rails.

Il peut être judicieux d'utiliser Time.use_zonepour un fuseau horaire par demande qui remplace le fuseau horaire par défaut défini dansconfig.time_zone

Plus de détails que j'explique à https://stackoverflow.com/a/25055692/542995


0

J'utilise simple_form dans Rails 4 et je viens d'ajouter le champ de saisie comme

<%= f.input :time_zone, :as => :time_zone %>

avec la migration

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end

1
Cela ne répond pas à la question de savoir comment convertir les objets DateTime
zykadelic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.