web-dev-qa-db-fra.com

Rails 3: Comment obtenir la date d'aujourd'hui dans un fuseau horaire spécifique?

Pour obtenir la date d'aujourd'hui, je fais:

Date.today    # => Fri, 20 May 2011

J'aimerais obtenir la date d'aujourd'hui dans un fuseau horaire spécifique, par exemple 'Melbourne'.

J'ai le paramètre suivant dans mon application.rb:

config.time_zone = 'Melbourne'

et je mets:

Time.zone = 'Melbourne'

dans mon contrôleur d'application avant chaque action.

Cependant, cela n'aide pas (je suppose que ces paramètres n'affectent que les dates stockées dans la base de données).

Comment pourrais-je obtenir la date d'aujourd'hui en 'Melbourne'?

66
Misha Moroshko

Vous devriez pouvoir faire ceci: Time.current. Cela afficherait l'heure actuelle à Melbourne si c'est ce que Time.zone est réglé sur.

58
Ryan Bigg

Les objets Date n'ont pas nécessairement de fuseau horaire, mais les objets Time en ont. Vous pouvez l'essayer en tant que Time, puis reconvertir en Date:

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

Date.current

Date.current est probablement le moyen le plus clair et le plus succinct, et a été ajouté dans Rails 3.

$ Date.current
#=> Sat, 14 Jul 2018

http://apidock.com/Rails/v3.2.13/Date/current/class

31
Josh

Il semble Time.zone.today fonctionne également.

14
Slick23

Si vous voulez obtenir "aujourd'hui" dans un fuseau horaire spécifié sans avoir à changer Time.zone, Je ferais quelque chose comme fl00r et Dylan Markow a suggéré:

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

ou ca:

Time.find_zone!('Melbourne').today

J'ai écrit une petite méthode d'aide Date.today_in_zone Qui rend encore plus facile l'obtention d'un "aujourd'hui" Date pour un fuseau horaire:

 # 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

Je pense que ça se lit un peu mieux que Time.find_zone!('Melbourne').today...

Pour l'utiliser, il suffit de le jeter dans un fichier comme 'lib/date_extensions.rb' Et require 'date_extensions'.

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

utiliser la classe DateTime

DateTime.now.in_time_zone 'Melbourne'
6
fl00r

Pour les noms de fuseau horaire valides, consultez: http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

2
mmattke
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
2
Max Williams

Dans Rails 3, vous pouvez simplement le faire en appelant to_time_in_current_zone sur un objet Date.

Date.today.to_time_in_current_zone
1
Slobodan Kovacevic