Dans Ruby / Rails, comment convertir un DateTime UTC en un autre fuseau horaire?
Dans Ruby / Rails, comment convertir un DateTime UTC en un autre fuseau horaire?
Réponses:
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)
require 'active_support/time'
abord.
rake time:zones:all
. Voir aussi rake -D time
. Définissez le fuseau horaire par défaut dans config/application.rb
.
si Time.zone
c'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
En rubis uni, avec seulement require 'date'
, utilisez la new_offset
mé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.
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.
Juste au cas où, si vous avez affaire à un objet ActiveRecord dans Rails.
Il peut être judicieux d'utiliser Time.use_zone
pour 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
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