Schienen: Konvertieren Sie UTC DateTime in eine andere Zeitzone

112

Wie konvertiere ich in Ruby / Rails eine UTC DateTime in eine andere Zeitzone?

Drew Johnson
quelle

Antworten:

206
time.in_time_zone(time_zone)

Beispiel:

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

oder nur

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

Sie können die Namen der ActiveSupport-Zeitzonen folgendermaßen ermitteln:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)
mckeed
quelle
Wenn ich in irb Time.now.in_time_zone ('CST') versuche, erhalte ich den Fehler "undefinierte Methode 'in_time_zone'". Gibt es Rails-Klassen, die ich brauche, damit dies funktioniert?
Drew Johnson
Welche Version von Rails verwenden Sie? Funktioniert es, wenn Sie Time.zone.now.in_time_zone (...) ausführen?
mckeed
13
Um dies außerhalb von Rails zu verwenden, require 'active_support/time'zuerst.
Sunaku
3
Sie können alle Zeitzonen durch Ausführen auflisten rake time:zones:all. Siehe auch rake -D time. Legen Sie die Standardzeitzone in fest config/application.rb.
user664833
1
@AdamEberlin In Rails verwenden Sie normalerweise ActiveSupport :: TimeWithZone, nicht DateTime. Der gesamte Code funktioniert sowohl für Ruby-DateTime-Objekte als auch für Time-Objekte.
mckeed
6

Wenn Time.zonees Ihre gewünschte Zeitzone ist, können Sie verwenden@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 
vladCovaliov
quelle
Funktioniert nicht auf Rails 5 `Time.zone # => Europa / Paris my_date # => Mi, 29. März 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => Mi, 29. März 2017 17:00:20 +0000`
Cyril Duchon-Doris
5

require 'date'Verwenden Sie in reinem Rubin nur mit new_offset:

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

Getestet mit Ruby 2.3.7, das unter Mac OS X 10.13 Standard war.

jbyler
quelle
3

Probieren Sie die TimeWithZone- Objekte von ActiveSupport aus , die mit TimeZone bearbeitet wurden . ActiveSupport bietet auch die Methode in_time_zone zum Konvertieren einer UTC-Zeit in eine angegebene TimeZone-Zeitzone. Die Antwort von mckeed zeigt den Code.

Fred
quelle
Wie lautet die Syntax zum Importieren von TimeWithZone in meine Klasse? Oder bekomme ich es standardmäßig mit Rails?
Drew Johnson
1
Ich glaube, Sie bekommen es standardmäßig. mckeed hat den Code, den Sie benötigen, aber Sie werden ihn in irb nicht sehen. Sie müssen es in Rails ausführen.
Fred
Du hast recht - danke, Fred - es wird standardmäßig mit Rails geliefert. Ich griff nach Strohhalmen und versuchte, sie in irb zum Laufen zu bringen.
Drew Johnson
3

Nur für den Fall, dass Sie mit ActiveRecord-Objekten in Rails arbeiten.

Es ist möglicherweise eine gute Idee, Time.use_zoneeine Zeitzone pro Anforderung zu verwenden, die die eingestellte Standardzeitzone überschreibtconfig.time_zone

Weitere Details erkläre ich unter https://stackoverflow.com/a/25055692/542995

zdk
quelle
0

Ich verwende simple_form in Rails 4 und habe gerade das Eingabefeld als hinzugefügt

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

mit der Migration

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end
Maudulus
quelle
1
Dies beantwortet nicht die Frage, wie Sie DateTime-Objekte konvertieren
zykadelic