Warum verhält sich diese Rails-Abfrage je nach Zeitzone anders?

8

Ich habe eine rails-time-basierte Abfrage, die ein merkwürdiges Zeitzonen-sensitives Verhalten hat, obwohl ich, soweit ich weiß, UTC verwende. Kurz gesagt, diese Abfragen geben unterschiedliche Antworten:

%Vor%

Wo die DB tatsächlich ein Modell enthält, das in der letzten Stunde erstellt wurde, und die Gesamtzahl der Modelle ist 280. Also ist nur die erste Abfrage korrekt.

Allerdings habe ich in environment.rb:

%Vor%

Die Systemzeitzone (wie von 'date' gemeldet) ist BST (was GMT + 1 ist) - also wird dies irgendwie als UTC behandelt und bricht Anfragen ab.

Dies verursacht mir alle möglichen Probleme, da ich die Abfrage, die zu verschiedenen Zeiten an eine Aktion übergeben wird, parametrieren muss (die dann mit Time.parse () konvertiert werden) und obwohl ich in UTC-Zeiten diese ausschalte um eine Stunde 'DST Ausgabe ernten viel. Selbst die Verwendung von '.gmtime ()' scheint es nicht immer zu beheben.

Offensichtlich wird der Unterschied irgendwie durch eine implizite Konvertierung verursacht, die irgendwo dazu führt, dass BST falsch als UTC behandelt wird, aber warum? Speichern Schienen nicht die Zeitstempel in UTC? Ist die Time-Class-Zeitzone nicht bekannt? Ich benutze Rails 2.2.2

Also, was ist hier los - und was ist der sichere Weg, es zu programmieren?

edit, einige zusätzliche Informationen um zu zeigen, was die DB und die Time Klasse machen:

%Vor%     
frankodwyer 11.08.2009, 20:49
quelle

3 Antworten

13

Die Klasse Time ist sich Ihrer konfigurierten Zeitzone nicht direkt bewusst. Rails 2.1 hat eine Reihe von Zeitzonen-Unterstützung hinzugefügt, aber Time wird weiterhin auf Ihre lokale Zeitzone wirken. Deshalb gibt Time.now eine BST-Zeit zurück.

Was Sie wahrscheinlich wollen, ist die Interaktion mit Time.zone . Sie können Methoden wie die Time-Klasse selbst aufrufen, sie werden jedoch in der angegebenen Zeitzone zurückgegeben.

%Vor%

Eine weitere Sache, mit der Sie vorsichtig sein müssen, ist, wenn Sie Abfragen in der Datenbank ausführen, in der Sie Zeiten vergleichen, aber sicher die UTC-Zeit verwenden (auch wenn Sie eine andere Zeitzone angegeben haben), weil Rails immer UTC speichert die Datenbank.

%Vor%

Auch statt Time.now-1.hour do 1.hour.ago . Es ist einfacher zu lesen und Rails wird automatisch die konfigurierte Zeitzone verwenden.

    
ryanb 11.08.2009, 21:36
quelle
0

Die Zeitzone, die Sie einstellen müssen, ist UK, dies wird automatisch mit BST

umgehen %Vor%     
MatthewFord 17.10.2010 01:12
quelle
0
%Vor%     
murat 03.06.2017 21:48
quelle