Laufzeit mit Zeitzone
Habe ich eine Zeichenfolge, die ich parse mit DateTime.strptime
. Die Zeitzone, das Datum in der Zeichenkette MEZ aber Ruby erstellt einen UTC-DateTime-Objekt, das natürlich einen offset von 2 Stunden zu.
Derzeit bin ich arbeiten, um das Problem mit DateTime.strptime().change(:offset => "+0020")
aber ich bin mir ziemlich sicher, dass dies nicht der Weg, es zum laufen gedacht.
Kann jemand aufklären mich auf den richtigen Weg, dies zu tun?
InformationsquelleAutor der Frage Nicolas | 2011-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich nicht löschen, eine akzeptierte Antwort
Als @LeeJarvis wies darauf hin, in den Kommentar-Abschnitt unten
Chronic.parse
nicht akzeptieren:time_class
option. Also diese Antwort ist buggy und während es sieht aus wie es funktioniert, ist es nicht (es sei denn, Chronische erlaubt die übergabe eine:time_class
option bald.)Den Chronischen gem ist wirklich mächtig.
Ich benutze es so:
In meinem Beispiel oben
User.first.time_zone
ist "Pacific Time (US & Canada)".Chronische unterstützt eine Vielzahl von Formaten, so dass Sie check it out auf
https://github.com/mojombo/chronic
Stellen Sie sicher, pass die
:time_class
option und konvertieren von UTC (in der Dokumentation, Chronische setzt:time_class
vor dem Aufruf von parse. Ich vermeiden, dieser Ansatz, denn es könnte dazu führen, dass andere Teile in der Anwendung, nicht zu arbeiten)Zeitzone der Dokumentation ist bei
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
InformationsquelleAutor der Antwort Abdo
Ich es auf folgende Weise:
Ist es, was du meinst?
InformationsquelleAutor der Antwort WarHog
Diese Werke in Rails 5:
Gibt die Zeit in der angegebenen Zeitzone.
InformationsquelleAutor der Antwort avergin
Zumindest als von Rails 4.2 (vielleicht aber auch früher, noch nicht getestet), solange Sie
Time#strptime
stattDateTime.strptime
die aktuelle Zeitzone wird automatisch angewendet:InformationsquelleAutor der Antwort Jared
War ich "strptiming" diese Zeichenfolge:
Einen lokalen Zeitstempel, der in meinem Fall ist Auckland NZ ohne Zeitzone Stempel in der Zeichenfolge als gesehen werden kann.
Als am besten ich kann erzählen
Time.strptime
verwendet die server-Zeitzone als Basis.In meiner situation, und die Allgemeine gute Praxis, meine Server laufen in der UTC-Zeitzone, so dass jeder Parsen der string landete ein time-Objekt, die Zeit um +0000 (UTC):
Dann die Umwandlung zu
in_time_zone(Time.zone)
gab:Die, wie gesehen werden kann, ist 12 Stunden (UTC-offset) später als die tatsächliche Zeit, die ich wollte.
Ich habe versucht, die
+' Auckland', '...%Z'
trick nach oben, ohne jede änderung.Ich habe dann das
+ '+1200', '...%Z'
trick ist, wie oben dargelegt, die richtig gearbeitet.Jedoch war ich besorgt über Sommer Zeit, dann wird das Parsen würde um eine Stunde, so ist dies, was ich nachgeholt habe:
Ergebnis:
Es ist nicht besonders elegant, aber es funktioniert.
InformationsquelleAutor der Antwort Gordon
Können Sie convert date, timezone mit
to_time_in_current_zone
. Zum Beispiel:InformationsquelleAutor der Antwort Mikhail K.
Ich habe gekämpft, das gleiche Problem versucht zu Parsen einer Zeichenkette für das Datum aus einem Formular und speichern Sie es unabhängig von den Servern Zeit. Der Prozess, den ich verfolgt habe, ist als solche.
Ich versichere die RoR und Ruby Zeitzonen sind auf UTC eingestellt ist. Es macht es einfacher wenn der server auf UTC-Zeit als gut.
Bin ich der Speicherung der Benutzer-Gebietsschema mit der ActiveSupport:TimeZone format wie
US/Eastern
Ich habe eine Interpretation der Funktion der für einen Datums-string nicht nativ enthalten eine Zeitzone oder der offset
Dies ist natürlich nicht das Gefühl, eine perfekte Lösung, aber es funktioniert.
Die Schritte, um zu gewährleisten Sie die korrekte Zeitzone:
InformationsquelleAutor der Antwort PaulSCoder
Pre-Schienen 5, die folgenden arbeiten:
InformationsquelleAutor der Antwort troelskn