2012-04-07 11 views
3

Ich stieß auf dieses Problem beim Testen einer Rails-App auf zwei verschiedenen Staging-Servern in verschiedenen Zeitzonen (PDT und CDT) bereitgestellt. Beide Server haben Rails, die die Standard-UTC config.time_zone verwenden. Abgesehen davon, dass die Konfiguration der Zeitzone anders ist, sind beide Uhren korrekt eingestellt.Rails Time.zone Parsing funktioniert nicht wie erwartet

Unten ist das, was ich in einer Schienen-Konsole sehen:

Auf dem Server, auf das System Zeitzone CDT ist,

Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)") 
=> Mon, 28 May 2012 05:00:00 UTC +00:00 

Auf dem Server, auf das System Zeitzone PDT,

Time.zone.parse("Mon May 28 2012 00:00:00 GMT-0700 (PDT)") 
=> Mon, 28 May 2012 07:00:00 UTC +00:00 

ist Die Zeichenfolge Mon May 28 2012 00:00:00 GMT-0700 (PDT) ist ein beliebiger Datum-Uhrzeit-Wert, der von einem Client gesendet wird. Dies ist ein häufiges Szenario, wenn ein JavaScript-Date-Objekt über die Params-Sammlung von rails verwendet wird.

Warum sind die beiden Ergebnisse Time.zone.parse(identical_date_time_string) unterschiedlich?

Wenn ich folgendes auf beiden Systemen ausführen, wird das Ergebnis korrekt:

"Mon May 28 2012 00:00:00 GMT-0700 (PDT)".to_time 
=> 2012-05-28 07:00:00 UTC 

Ich Schienen 3.2.3 mit Ruby 1.9.3-p125, auf Ubuntu läuft.

+1

ein Problem gegen Schienen Eröffnet https://github.com/rails/rails/issues/5770 –

+0

Managed Active :: Time-Zone patchen Datum Saiten des zu handhaben Format hier Sie können den Patch [hier] (https://github.com/rails/rails/issues/5770#issuecomment-5010661) in Kommentaren finden. –

+0

Das ursprüngliche Problem ist jetzt in Schienen behoben, mit diesem commit https://github.com/rails/rails/commit/005d910624bbfa724b638426a000c8074d4201a2 –

Antwort

0

ActiveSupportTimeZone.parse versucht nicht, die Zeitzoneninformationen aus der angegebenen Zeichenfolge zu extrahieren. Es extrahiert einfach Datum und Uhrzeit und konvertiert es in eine TimeWithZone mit der angegebenen (lokalen) Zeitzone.

str.to_time wird die "GMT-0700" Zeile beachten, aber eine Zeit ohne Zeitzone erzeugen.

Sie könnten es täuschen, indem Sie den Teil "GMT ....." extrahieren und in einen UTC-Offset umwandeln, der nahe, aber nicht genau der Zeitzone ist.

+0

Hallo Michael, ich fügte weitere Details darüber, wie die gleiche Datum-Uhrzeit-Zeichenfolge korrekt analysiert wird, wenn Sie die verwenden . "to_time" -Methode für die Zeichenfolge. Das funktioniert konsequent und genau. –

0

Hier ist, wie ich es tun

> Time.zone = "Hawaii" 
=> "Hawaii" 
> Time.zone.parse("Tue Mar 13 2012 13:00:00 GMT+1300 (NZDT)".sub("GMT","")) 
=> Mon, 12 Mar 2012 14:00:00 HST -10:00 
> Time.zone = "UTC" 
=> "UTC" 
> Time.zone.parse("Tue Mar 13 2012 13:00:00 GMT+1300 (NZDT)".sub("GMT","")) 
=> Tue, 13 Mar 2012 00:00:00 UTC 00:00 
+0

Joseph, das Problem ist jetzt in Schienen behoben. Siehe https://github.com/rails/rails/commit/005d910624bbfa724b638426a000c8074d4201a2 –

+0

@ShyamHabarakada Danke für den Tipp. Freut mich, dass sie das endlich bekommen haben – JosephL

+0

Gern geschehen. –

Verwandte Themen