2010-10-27 8 views
13

Ich bin etwas verwirrt über Zeitzonen in Schienen. Ich möchte, dass meine Rails-App die britische Sommerzeit (wie die Sommerzeit in den USA) für die Zeitstempel verwendet, die in den Modellen updated_at und created_at in meinen Modellen festgelegt sind. Ich änderte meine environment.rbZeitstempel von Schienen verwenden nicht die richtige Zeitzone

config.time_zone = 'London' 

Der Ubuntu-Server meiner app zu sagen, sind auf BST zu verwenden, scheint es an der Zeit: in der Befehlszeile, zum Beispiel, wenn i ‚date‘ Typ i die aktuelle Zeit erhalten (nicht um eine Stunde versetzt). In der Schienenkonsole sehe ich folgendes:

Alles gut. Wenn ich jedoch ein neues AR-Modellobjekt anlege und es speichere, sind die Zeitstempel vor einer Stunde. Es sieht so aus, als ob UTC verwendet wird. Nun kann ich die Logik darin sehen: Da die Zeitstempel in der Modelllogik verwendet werden können, möchten Sie, dass sie auf einer unveränderlichen Messuhrzeit basieren, dh UTC. Aber dies ist ein seltsames Stück Verhalten, das ich nicht verstehe:

#change a record and save it 
>> someobj.save 
=> true 
#object's updated_at is one hour ago 
>> someobj.updated_at 
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00 
>> Time.now 
=> Wed Oct 27 16:34:31 +0100 2010 
#however, Time.now - object's updated at is just a few seconds. 
>> Time.now - someobj.updated_at 
=> 15.305549 

Also, bevor die Subtraktion tun, updated_at in die aktuelle Zeitzone umgewandelt wird.

Der Grund, dass ich das Datum in der aktuellen Zeitzone anzeigen möchte, ist nur für Statusberichte usw. in den Ansichten: Wenn jemand etwas aktualisiert, möchte ich sehen, dass es vor '1 Minute' und nicht vor '1 Stunde aktualisiert wurde ".

Kann mich jemand unconfused? Prost, max

EDIT: Mein unmittelbares Problem, die richtige Zeit im Status zu zeigen, wird gelöst, indem Sie den "time_ago_in_words" Helfer verwenden, der sich für die Zeitzone einstellt. Ich möchte immer noch jemanden, der erklärt, was mit den Zeitstempeln passiert :)

Antwort

38

Zeitstempel werden standardmäßig in UTC gespeichert, und dies ist wahrscheinlich der beste Weg, dies zu tun. Wenn Sie von einer Serverumgebung in eine andere wechseln, möchten Sie nicht, dass sich Ihre Zeiten verschieben, nur weil Sie die Zeitzonen gewechselt haben.

Wenn Sie wissen wollen, was der Zeitstempel in Ihrer Zeitzone ist, müssen Sie nur noch darum bitten, dass die Art und Weise:

someobj.updated_at.localtime 
+0

ah - das ist großartig. Vielen Dank! Ich stimme zu, dass es sinnvoll ist, sie alle in UTC zu behalten. –

+0

ok, ich habe es. aber wenn ich die localtime auf der datetime anzeigen möchte, auf meiner Ansicht auswählen was kann ich tun? – Diego

+0

Wahrscheinlich ist der beste Weg, eine JavaScript-Methode zu verwenden, um Systemzeiten den lokalen Zeiten des Browsers zuzuordnen. Das ist eine andere Frage. – tadman

2

Beachten Sie den Offset am Ende der Zeiten - der erste Offset ist 0, der zweite ist 1. Wenn die Zeit Berechnung auftritt, Der Versatz wird automatisch eingefügt, so dass die Subtraktion Ihnen das korrekte Ergebnis liefert. someobj.updated_at und Time.now zeigen jeweils ihren Wert in einer anderen Zeitzone an, so dass sie wirklich nur 9 Sekunden auseinander liegen, nicht 1 Stunde und 9 Sekunden.

Verwandte Themen