Schienen: Konvertieren Sie UTC DateTime in eine andere Zeitzone


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)

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 

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.


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.


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


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

1
Dies beantwortet nicht die Frage, wie Sie DateTime-Objekte konvertieren
— zykadelic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.