2012-07-12 2 views
29

Ich habe die Zeitzone in /config/application.rb festgelegt, und ich erwarte, dass alle in meiner App generierten Zeiten standardmäßig in dieser Zeitzone liegen. Wenn ich jedoch ein neues Objekt DateTime anlege (unter Verwendung von .new), wird es in GMT erstellt. Wie kann ich erreichen, dass es in der Zeitzone meiner App angezeigt wird?Wie erstelle ich ein neues DateTime-Objekt in einer bestimmten Zeitzone (vorzugsweise die Standardzeitzone meiner App, nicht UTC)?

/config/application.rb

config.time_zone = 'Pacific Time (US & Canada)' 

irb

irb> DateTime.now 
=> Wed, 11 Jul 2012 19:04:56 -0700 

irb> mydate = DateTime.new(2012, 07, 11, 20, 10, 0) 
=> Wed, 11 Jul 2012 20:10:00 +0000     # GMT, but I want PDT 

Mit in_time_zone funktioniert nicht, weil das nur die GMT-Zeit zu PDT Zeit konvertiert, die das falsch ist Zeit:

irb> mydate.in_time_zone('Pacific Time (US & Canada)') 
=> Wed, 11 Jul 2012 13:10:00 PDT -07:00    # wrong time (I want 20:10) 

Antwort

27

können Sie Active die Verwendung TimeWithZone (Time.zone) Objektdaten in die Zeitzone Ihrer Anwendung zu erstellen und analysieren:

1.9.3p0 :001 > Time.zone.now 
=> Wed, 11 Jul 2012 19:47:03 PDT -07:00 
1.9.3p0 :002 > Time.zone.parse('2012-07-11 21:00') 
=> Wed, 11 Jul 2012 21:00:00 PDT -07:00 
+1

Das ist wirklich hilfreich! Was aber, wenn Sie eine Zeit in einer anderen Zone erstellen möchten, als Sie config.time_zone = in config/application.rb festgelegt haben? – idrinkpabst

+0

Ich würde etwas wie '' 2012-07-11 21: 00'.to_datetime.in_time_zone ('Eastern Time (USA und Kanada)') ' –

+2

verwenden das funktioniert eigentlich nicht. Nehmen wir an, Sie möchten eine Zeit in Zone für 9 Uhr Eastern erstellen. Wenn Sie '2012-07-11 09: 00'.to_datetime.in_time_zone (' Eastern Time (USA & Kanada) ') eingeben, erhalten Sie dadurch die falsche Zeit zurück, da die Konvertierung von UTC erfolgt. Wenn Sie '2012-07-11 09:00 Eastern Time (USA & Kanada)'. to_datetime.in_time_zone ('Eastern Time (USA & Kanada)') tun, funktioniert dies immer noch nicht, da DateTime bei Tageslicht unschön ist Sparzeit. Am besten vermeiden Sie DateTime vollständig. Irgendwelche Ideen? – idrinkpabst

0

Ich mache folgendes in ApplicationController, um die Zeitzone auf die Benutzerzeit einzustellen.

Ich bin mir nicht sicher, ob dies das ist, was Sie wollen.

class ApplicationController < ActionController::Base 
    before_filter :set_timezone 
    def set_timezone 
    # current_user.time_zone #=> 'London' 
    Time.zone = current_user.time_zone if current_user && current_user.time_zone 
    end 

end 
+1

Das ist nicht, was ich suchte, aber dank für die Entsendung .. vielleicht wird es an jemand anderen hilfreich sein. – user664833

6

Wenn ich es, ich in der Regel nur die UTC_Offset geben Sie bei der Zeit Instanziieren .new oder DateTime.new.

[1] pry(main)> Time.new(2013,01,06, 11, 25, 00) #no specified utc_offset defaults to system time 
=> 2013-01-06 11:25:00 -0500 
[2] pry(main)> Time.new(2013,01,06, 11, 25, 00, "+00:00") #UTC 
=> 2013-01-06 11:25:00 +0000 
[3] pry(main)> Time.new(2013,01,06, 11, 25, 00, "-08:00") #PST 
=> 2013-01-06 11:25:00 -0800 
8

Eine andere Möglichkeit, ohne String-Analyse:

irb> Time.zone.local(2012, 7, 11, 21) 
=> Wed, 07 Nov 2012 21:00:00 PDT -07:00 
Verwandte Themen