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.