Ich habe einen Datensatz foo
in der Datenbank, der :start_time
und :timezone
Attribute hat.
Das :start_time
ist eine Zeit in UTC - 2001-01-01 14:20:00
zum Beispiel. Das :timezone
ist eine Zeichenfolge - America/New_York
zum Beispiel.
Ich möchte ein neues Zeitobjekt mit dem Wert erstellen :start_time
, dessen Zeitzone jedoch durch angegeben ist :timezone
. Ich möchte das nicht laden :start_time
und dann konvertieren :timezone
, da Rails clever ist und die Zeit von UTC aktualisiert, um mit dieser Zeitzone übereinzustimmen.
Zur Zeit,
t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t.in_time_zone("America/New_York")
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
Stattdessen möchte ich sehen
=> Sat, 01 Jan 2000 14:20:00 EST -05:00
dh. Ich will das tun:
t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST
Antworten:
Klingt so, als ob Sie etwas in der Art von wollen
Dies besagt, dass diese Ortszeit (unter Verwendung der Zone) in utc konvertiert wird. Wenn Sie eingestellt haben
Time.zone
, können Sie das natürlich tunDabei wird die an t angehängte Zeitzone nicht verwendet. Es wird davon ausgegangen, dass sie lokal für die Zeitzone ist, aus der Sie konvertieren.
Ein Randfall, vor dem Sie sich schützen sollten, sind Sommerzeitübergänge: Die von Ihnen angegebene Ortszeit ist möglicherweise nicht vorhanden oder nicht eindeutig.
quelle
Time.use_zone(self.timezone) { Time.zone.local_to_utc(t) }.localtime
Ich habe gerade das gleiche Problem gehabt und hier ist, was ich tun werde:
Hier ist die Dokumentation zu asctime
quelle
asctime
ist, dass es alle Subsekundenwerte fallen lässt (was meine Antwort behält).Wenn Sie Rails verwenden, ist hier eine andere Methode in Anlehnung an Eric Walshs Antwort:
quelle
.in_time_zone
bis zum Ende.Time.zone.now
würde es funktionieren, wenn Sie etwas ersetzen , das der Zeit am nächsten kommt, die Sie ändern möchten?Sie müssen den Zeitversatz zu Ihrer Zeit hinzufügen, nachdem Sie ihn konvertiert haben.
Der einfachste Weg, dies zu tun, ist:
Ich bin mir nicht sicher, warum Sie dies tun möchten, obwohl es wahrscheinlich am besten ist, tatsächlich mit Zeiten zu arbeiten, wie sie gebaut sind. Ich denke, einige Hintergrundinformationen darüber, warum Sie die Zeit verschieben müssen, und Zeitzonen wären hilfreich.
quelle
Time.in_time_zone
die richtigen Teile von active_support benötigen:require 'active_support/core_ext/time'
Eigentlich denke ich, dass Sie den Offset subtrahieren müssen, nachdem Sie ihn konvertiert haben, wie in:
quelle
Hängt davon ab, wo Sie diese Zeit verwenden werden.
Wenn Ihre Zeit ein Attribut ist
Wenn time als Attribut verwendet wird, können Sie dasselbe Juwel date_time_attribute verwenden :
Wenn Sie eine separate Variable festlegen
Verwenden Sie dasselbe Juwel date_time_attribute :
quelle
Schnelle kleine Funktion, die ich mir ausgedacht habe, um den Job zu lösen. Wenn jemand eine effizientere Möglichkeit hat, dies zu posten, posten Sie es bitte!
quelle
Die Prämisse des OP ist falsch: "Ich möchte die: start_time nicht laden und dann in: timezone konvertieren, da Rails clever ist und die Zeit von UTC aktualisiert, um mit dieser Zeitzone übereinzustimmen." Dies ist nicht unbedingt der Fall, wie die hier gegebene Antwort zeigt.
quelle
t.zone
vorher rennst,t.change
was siehst du? Und was ist, wenn du hinterhert.zone
rennstt.change
? Und an welche Parameter übergeben Siet.change
genau?Ich habe einige Hilfsmethoden erstellt, von denen eine genau das tut, was der ursprüngliche Autor des Beitrags bei Ruby / Rails verlangt - Ändern Sie die Zeitzone einer Zeit, ohne den Wert zu ändern .
Außerdem habe ich einige Besonderheiten dokumentiert, die ich beobachtet habe, und diese Helfer enthalten Methoden zum vollständigen Ignorieren der automatischen Sommerzeiteinsparungen, die bei Zeitumrechnungen anfallen, die im Rails-Framework nicht sofort verfügbar sind:
Beispiele, die auf der Rails-Konsole oder einem Ruby-Skript ausprobiert werden können, nachdem die oben genannten Methoden in eine Klasse oder ein Modul eingeschlossen wurden:
Hoffe das hilft.
quelle
Hier ist eine andere Version, die für mich besser funktioniert hat als die aktuellen Antworten:
Es überträgt Nanosekunden mit "% N". Wenn Sie eine andere Präzision wünschen, lesen Sie diese Strftime-Referenz .
quelle
Ich habe auch viel Zeit mit TimeZones verbracht und nach dem Basteln mit Ruby 1.9.3 festgestellt, dass Sie vor dem Konvertieren nicht in ein benanntes Zeitzonensymbol konvertieren müssen:
Dies bedeutet, dass Sie sich darauf konzentrieren können, zuerst in der gewünschten Region die richtige Zeiteinstellung zu erhalten, wie Sie es sich vorstellen würden (zumindest in meinem Kopf partitioniere ich es auf diese Weise) und dann am Ende in die Zone zu konvertieren Sie möchten Ihre Geschäftslogik mit überprüfen.
Dies funktioniert auch für Ruby 2.3.1.
quelle