2017-03-21 1 views
0

Es gibt Tabellendaten, die generisch sind und daher nur Zeit als Daten benötigen (kein Datum). Somit wird der Datentyp in postgresql als time gespeichert.Warum speichert Rails Zeitformatdaten als UTC

Aber dann diese idiosyncracy

> @day_schedules.first 
=> #<Schedule id: 17, start_time: "2000-01-01 06:00:00" 

Dann erscheint,

> @day_schedules.first.start_time 
=> 2000-01-01 06:00:00 UTC 

in der Tat so ist diese Daten falsch wenn man will Daten mit datetime Datentypen vergleichen, sagen ...

@interruptions[0].pause 
=> Sat, 18 Mar 2017 07:35:18 CET +01:00 

wie jetzt sind wir compa klingelt UTC bis MEZ ... Wie kann der time als gegebener Wert "06:00:00" behandelt werden, aber für die CET +01:00 Zeitzone?

+2

Alles soll in der Datenbank UTC sein, weil das die Rails Way ist. Ihre "Zeit" (eigentlich "Zeit ohne Zeitzone") ist nur eine Tageszeit in der Datenbank. Es gibt keine [Uhrzeitklasse in Ruby] (http://stackoverflow.com/a/42539230/479863), daher das Datum 2001-01-01 in Ihrer 'start_time'. Zeitzonen können in Ruby-Land angewendet werden oder auch nicht. Ich nehme an, dass Sie eine bessere Zeit haben würden, die Arbeit in der Datenbank zu erledigen (wo die Tageszeit eine echte Sache ist) und nur Zeitstempel herauszuziehen. –

+0

Wenn ich nicht falsch liege, versuchst du zwei Zeitstempel zu vergleichen, in denen einer in UTC und der andere in CET ist. Es kann als Standard angesehen werden, dass Sie alles auf dem Server als UTC behandeln/speichern und dann entsprechend ändern sollten, wenn Sie es im Browser oder im Backend selbst zurücksenden. In diesem Fall werde ich vorschlagen, die andere Zeitzone in UTC zu konvertieren und dann die Berechnungen durchzuführen. Hilft das? – aks

+0

Der Trick bestand darin zu verstehen, dass die Daten in UTC gespeichert sind, aber Datum und Uhrzeit sich beim Aufruf unterschiedlich verhalten. Die Lösung besteht also darin, einen Kettenbefehl zu verwenden, um Elemente auf einer konsistenten Basis zu verknüpfen. Start_time.in_time_zone Das ** in_time_zone ** -Suffix brachte alle Vergleiche in einer Zeile. – Jerome

Antwort

0

Um auf Mu Kommentar zu erweitern. Rails speichert Zeit in UTC als Standard, aber dies kann geändert werden, wenn alle Formate mit einem anderen lokalen übereinstimmen sollen. Ich muss warnen, dass es in der Regel als Best Practice gilt, in UTC zu bleiben, aber wenn Sie nach Dabble suchen, können Sie:

Starten Sie zuerst rake time:zones:all, um die verfügbaren Zeitzonen zu sehen, die Sie in der Rails-Konfiguration festlegen können. Dann, wenn Sie haben wollen Rails eine dieser Zeitzonen verwenden Sie es wie folgt in Ihrem application.rb oder initializer Datei einstellen:

application.rb

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

Dann können Sie auch die folgende Zeile hinzufügen unter dem time_zone der Active wird, geben Sie Ihre Daten im gleichen Format wie die neue Zeitzone speichern Sie gerade eingestellt haben:

config.active_record.default_timezone = :local 
Verwandte Themen