2012-11-14 15 views
15

für eine Weile zu verstehen, ich versuche, wie diese Zeitzone mal funktioniert, und ich hatte eine Frage:Rails Zeitzone und Sommerzeit

heute in meinem Land, wir sind in der Sommerzeit (GMT-2). So der Benutzer meiner Anwendung geben Sie eine Zeit, wie 11:00 Uhr und senden Sie das Formular. Soweit ich weiß, wird Rails dieses Datum in UTC konvertieren und in der Datenbank speichern (mysql in meinem Fall), wie: 01:00 PM UTC.

Wenn ich diesen Datensatz wiederherstellen, musste ich auf lokale Zeit konvertieren, um anzuzeigen. OK?

Meine Frage ist, nehmen wir an, dass dieses Datum/diese Uhrzeit ein Datum/eine Uhrzeit in der Zukunft darstellt, wenn mein Land aus der Sommerzeit herauskommt (GMT-3). Schienen sparen 01.00 Uhr UTC? Wie wird es heute in der Sommerzeit sein? Und wie wird es in Zukunft sein?

Grundsätzlich muss ich immer um 11.00 Uhr Benutzer anzeigen.

danke.

Antwort

2

7 Monate nachdem Sie gefragt haben, aber vielleicht skip_time_zone_conversion_for_attributes = hilft - es teilt AR mit, keine Zeitzonen beim Speichern oder Abrufen zu konvertieren. Siehe [Activetimestamp] (http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html), die das Beispiel zeigt:

class Topic < ActiveRecord::Base 
    self.skip_time_zone_conversion_for_attributes = [:written_on] 
end 

--Kip

13

Es gibt mehrere Orte, an denen die Zeitzone ins Spiel kommen kann: die Standardeinstellung des Betriebssystems (oder des Benutzerkontos), der Datenbankserver, Rails environment.rb.

Der Schlüssel ist, um sicherzustellen, dass alle Daten mit UTC-Zeitzone gespeichert sind, dann in was auch immer Ihre lokale Zeitzone angezeigt wird. Es klingt, als ob du das tust.

So scheint Ihre Frage auf "wenn es Sommerzeit ist, möchte ich um -3 Stunden Offset, sonst Offset von -2 Stunden" herunterkochen ". Mit den Rails-Zeitverlängerungen können Sie Ihren aktuellen Versatz wie Time.zone.now.utc_offset ermitteln, und Time#dst? sagt Ihnen, wenn es Sommerzeit mit diesen beiden ist, können Sie die zusätzliche Stunde (3600 hundert Sekunden) bedingt subtrahieren.

+1

Also, es ist eine Frage der Anzeige, immer. Alle Datumswerte, die an einen Filterparameter übergeben werden, müssen in diesem Fall in UTC konvertiert werden. – Beetlejuice

+1

Das ist der richtige Weg, um darüber nachzudenken, obwohl vielleicht meine Wahl der Wörter "angezeigt" war nicht hilfreich. Ich hatte vor ein paar Wochen einen Fall, bei dem ein Partner um 2 Uhr morgens einen Job hatte (unabhängig von der DST-Korrektur), was bedeutete, dass wir uns damit abstimmen mussten. In Wahrheit spielt es keine Rolle, in welcher Zeitzone das Datum als * gespeichert wird, solange es die Zeitzone * enthält - wenn Sie Ihre eigene Zeitzone und die des gespeicherten Datums kennen, haben Sie alles, um die Zeit einzustellen und anzuzeigen wie auch immer du es brauchst. Das Speichern von Daten als UTC (und das Setzen von Systemen auf UTC) macht das alles einfacher. –

+0

Nun, lassen Sie uns annehmen, dass wir jetzt in der Sommerzeit sind und wir einen Rekord um 8 Uhr Ortszeit speichern. Dies wird eine 10-Uhr-Datei in der Datenbank speichern. Auf der anderen Seite, stellen Sie fest, dass jetzt die normale Zeit ist und wir speichern eine Aufzeichnung um 8 Uhr Ortszeit und speichern 11 Uhr UTC in der Datenbank. Es ist nicht möglich, beide Aufzeichnungen als 8 Uhr für den Benutzer anzuzeigen. Nun, wenn wir alle auf UTC einstellen, wird es funktionieren. – Beetlejuice

Verwandte Themen