Schienen 3: Wie erhalte ich das heutige Datum in einer bestimmten Zeitzone?

74

Um das heutige Datum zu bekommen, mache ich:

Date.today    # => Fri, 20 May 2011

Ich möchte das heutige Datum beispielsweise in einer bestimmten Zeitzone erhalten 'Melbourne'.

Ich habe die folgende Einstellung in meinem application.rb:

config.time_zone = 'Melbourne'

und ich setze:

Time.zone = 'Melbourne'

in meinem Anwendungscontroller vor jeder Aktion.

Es hilft jedoch nicht (ich denke, da diese Einstellungen nur Daten betreffen, die in der Datenbank gespeichert sind).

Wie könnte ich das heutige Date bekommen 'Melbourne'?

Mischa Moroshko
quelle

Antworten:

63

Sie sollten dazu in der Lage sein : Time.current. Das würde die aktuelle Zeit in Melbourne anzeigen, wenn dies Time.zoneeingestellt ist.

Ryan Bigg
quelle
6
Time.zone.now.to_dateist das eleganteste! Vielen Dank!
Mischa Moroshko
25
Time.current.to_dateist noch besser!
Mischa Moroshko
5
Noch besser für jedes Date-Objekt: Date.today.to_time_in_current_zone
Slobodan Kovacevic
2
@SlobodanKovacevic Date.today.to_time_in_current_zone gibt ein Zeitobjekt NICHT ein Datumsobjekt zurück.
Josh
1
@ Ziggy: Time.current.beginning_of_day + 18.hourswird auch funktionieren :)
Ryan Bigg
67

DateObjekte haben nicht unbedingt Zeitzonen, TimeObjekte jedoch. Sie können es als versuchen Timeund dann wieder konvertieren zu Date:

Time.now.to_date
# => Thu, 19 May 2011 
Time.now.in_time_zone('Melbourne').to_date
# => Fri, 20 May 2011 
Dylan Markow
quelle
16

Wenn Sie "heute" in einer bestimmten Zeitzone erhalten möchten, ohne sich ändern zu müssen Time.zone, würde ich so etwas wie fl00r tun und Dylan Markow schlug vor:

Time.now.in_time_zone('Melbourne').to_date

oder dieses:

Time.find_zone!('Melbourne').today

Ich habe eine kleine Hilfsmethode geschrieben Date.today_in_zone, die es Datenoch einfacher macht, ein "Heute" für eine Zeitzone zu erhalten:

 # Defaults to using Time.zone
 > Date.today_in_zone
=> Fri, 26 Oct 2012

 # Or specify a zone to use
 > Date.today_in_zone('Melbourne')
=> Sat, 27 Oct 2012

Ich denke, es liest sich ein bisschen schöner als Time.find_zone!('Melbourne').today...

Um es zu verwenden, werfen Sie dies einfach in eine Datei wie 'lib/date_extensions.rb'und require 'date_extensions'.

class Date
  def self.today_in_zone(zone = ::Time.zone)
    ::Time.find_zone!(zone).today
  end
end
Tyler Rick
quelle
14

Es scheint Time.zone.todayauch zu funktionieren.

Slick23
quelle
7

benutze DateTimeKlasse

DateTime.now.in_time_zone 'Melbourne'
fl00r
quelle
Das ist eine schöne, prägnante Art, die ich vorher noch nicht gesehen hatte. Es sieht so aus, als würde Time.now.in_time_zone 'Melbourne' auch funktionieren.
Tyler Rick
1
Dies sollte waaay mehr upvoted werden. Klar, prägnant, funktioniert mit Datumsangaben, erfordert kein ActiveSupport und erfordert kein Durcheinander in den Konfigurationseinstellungen.
JacobEvelyn
2
ruby-1.9.2-p0 :004 > Time.now
 => 2011-05-19 15:46:45 +0100 
ruby-1.9.2-p0 :006 > Time.now.in_time_zone('Melbourne')
 => Fri, 20 May 2011 00:47:00 EST +10:00 
ruby-1.9.2-p0 :007 > Time.now.in_time_zone('Melbourne').to_date
 => Fri, 20 May 2011
Max Williams
quelle
1

In Rails 3 können Sie dies einfach tun, indem Sie to_time_in_current_zone für ein Date-Objekt aufrufen.

Date.today.to_time_in_current_zone
Slobodan Kovacevic
quelle
1
Wenn sich die Serverzeit von der Rails-Zeitzone unterscheidet, wird Date.today möglicherweise das Datum von gestern oder morgen zurückgegeben. Das Anrufen to_time_in_current_zonewird dann zu einer Zeit in der Rails-Zone, aber zu einer Zeit, die gestern oder morgen sein kann. Dies ist nützlich, wenn Sie ein Datum haben, von dem bekannt ist, dass es in der richtigen Zeitzone liegt Time.zone.today, aber irreführend ist Date.today.
Henrik N