2015-08-20 6 views
6

Ich verwende Rails 4.2. Ich habe eine Date, die ich in eine DateTime konvertieren möchte. Wenn ich die vorhandene Methode to_datetime verwende, wird sie in GMT konvertiert. (Ich habe jetzt für etwa eine Stunde bei Threads geschaut und nicht genau dieses Problem finden konnten, so entschuldige mich im Voraus, wenn es vorhanden ist!)Was ist der beste Weg, um ein Datum zu einer DateTime in der aktuellen Zeitzone in Rails 4 zu konvertieren?

irb(main):030:0> Date.current 
=> Wed, 19 Aug 2015 
irb(main):031:0> Date.current.to_datetime 
=> Wed, 19 Aug 2015 00:00:00 +0000 

Wenn ich dann versuchen, in_time_zone zu verwenden, um es zu dem Strom umwandelt Zeitzone aber subtrahiert auch den Offset vom Datum.

irb(main):032:0> Date.current.to_datetime.in_time_zone 
=> Tue, 18 Aug 2015 17:00:00 PDT -07:00 

Wie kann ich eine vorhandene Date zu einem DateTime in der aktuellen Zeitzone konvertieren?

+0

Was ist die "richtige" Zeitzone? Was gibt 'Time.zone' zurück? – sebkkom

+0

Von "korrekt" zu "aktuell" geändert, was PST ist. –

+0

Gibt 'Time.zone' dann' PST' zurück? – sebkkom

Antwort

8

Hier ist die beste Antwort, die ich mir vorstellen konnte.

Time.zone.at(Date.current.to_time).to_datetime 
+3

"Date.current.to_time" verwendet standardmäßig die lokale Zeitzone, daher sollte "Date.current.to_time.to_datetime" gleich funktionieren. – zuo

+0

Danke! Bearbeitet es in die Antwort –

+1

aber lokale Zeitzone kann nicht das selbe sein wie rails timezone wie in 'application.rb' mit config gesetzt, also denke ich, dass' Time.zone.at' immer noch eine bessere Wahl in Schienenumgebung sein könnte – zuo

3

Ich hatte ein ähnliches Problem, und ich habe dies:

Time.use_zone("Europe/Berlin") do 
    midnight = Time.zone.parse(@date.to_s) 
end 

das im Grunde das Datum als Zeit Instanz neu erstellt, während in der Zielzeitzone ist, um Mitternacht, ohne „bewegten“ die Zeit Instanz um.

+0

Dieser funktionierte für mich, aber ich musste den Block 'Time.use_zone' nicht verwenden, da die App bereits die richtige Zeitzone konfiguriert hat. Es war im Grunde 'beginning_of_day = Time.zone.parse (@ date.to_s)' –

Verwandte Themen