it-swarm.com.de

Konvertieren Sie UTC in Ortszeit in Rails 3

Ich habe Probleme beim Konvertieren einer UTC Time oder TimeWithZone in Ortszeit in Rails 3.

Angenommen, moment ist eine Time-Variable in UTC (z. B. moment = Time.now.utc). Wie konvertiere ich moment in meine Zeitzone und kümmere mich um DST (d. H. Mit EST/EDT)?

Genauer gesagt, ich möchte "Montag, 14. März, 9.00 Uhr" ausdrucken, wenn die Uhrzeit heute morgen um 9.00 Uhr EDT und "Montag, 7. März, 9.00 Uhr" entspricht, wenn am letzten Montag 9.00 Uhr EST war.

Hoffentlich gibt es einen anderen Weg?

Bearbeiten: Ich dachte zuerst , dass "EDT" eine anerkannte Zeitzone sein sollte, aber "EDT" ist keine tatsächliche Zeitzone, eher wie der Zustand einer Zeitzone. Beispielsweise wäre es nicht sinnvoll, nach Time.utc(2011,1,1).in_time_zone("EDT") zu fragen. Es ist etwas verwirrend, da "EST" ist eine tatsächliche Zeitzone ist, die an einigen Stellen verwendet wird, die keine Sommerzeit verwenden und (UTC-5) ein Jahr lang sind.

90

Rails hat eigene Namen. Sehen Sie sie mit:

rake time:zones:us

Sie können auch rake time:zones:all für alle Zeitzonen ausführen. __ Um weitere zonenbezogene Rake-Aufgaben anzuzeigen: rake -D time

Um in EST umzuwandeln, automatisch für DST zu sorgen:

Time.now.in_time_zone("Eastern Time (US & Canada)")
104
Zabba

Time#localtime gibt die Uhrzeit in der aktuellen Zeitzone des Computers an, auf dem der Code ausgeführt wird:

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 

Update: Wenn Sie nicht zu Ihrer eigenen Zeitzone, sondern zu bestimmten Zeitzonen konvergieren möchten, sind Sie auf dem richtigen Weg. Anstatt sich jedoch um EST gegen EDT zu kümmern, sollten Sie einfach die allgemeine östliche Zeitzone passieren - es wird anhand des Tages wissen, ob es EDT oder EST ist:

> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
  => Mon, 14 Mar 2011 11:21:05 EDT -04:00 
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
  => Sat, 14 Jan 2012 10:21:18 EST -05:00 
107
Dylan Markow

Es gibt tatsächlich einen Nice Gem namens local_time von basecamp, der all dies nur auf Kundenseite durchführt, ich glaube:

https://github.com/basecamp/local_time

15
mahatmanich

Es ist einfach, es mithilfe der lokalen Systemzone () Zu konfigurieren. Fügen Sie dies einfach in Ihrer application.rb hinzu

config.time_zone = Time.now.zone

Dann sollte Rails Ihnen Zeitstempel in Ihrer Ortszeit anzeigen, oder Sie können eine solche Anweisung verwenden, um die Ortszeit zu ermitteln

Post.created_at.localtime
10
jacr1614

Ich weiß nicht warum, aber in meinem Fall funktioniert es nicht so, wie es früher vorgeschlagen wurde ... Aber es funktioniert so:

Time.now.change(offset: "-3000")

Natürlich müssen Sie den Wert von offset in Ihren Wert ändern.

0
Seybo Glaux

Wenn Sie dies tatsächlich tun, nur weil Sie die Zeitzone des Benutzers abrufen möchten, müssen Sie lediglich Ihre Zeitzone config/applications.rb ändern.

So was:

Rails speichert Ihre Zeitaufzeichnung standardmäßig in UTC, auch wenn Sie die aktuelle Zeitzone angeben.

config.time_zone = "Singapore"

Das ist alles, was Sie tun müssen, und Sie sind gut zu gehen.

0
therealadrain