57 votes

Dans Rails, quelle est la meilleure façon de créer une heure spécifique (pas maintenant) dans un fuseau horaire particulier ?

Voici une façon, mais pouvez-vous penser à une façon plus idiomatique ?

>> Time.use_zone('Sydney'){ Time.zone.parse('2011-04-12 2pm') }
=> Tue, 12 Apr 2011 14:00:00 EST +10:00

49voto

toxaq Points 2427

Je pense que vous recherchez

Time.find_zone('Alaska').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 AKST -09:00

Time.find_zone('Amsterdam').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 CET +01:00 

Time.find_zone('Sydney').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 EST +11:00  

Time.find_zone('Wellington').local(2011,1,1)
=> Sat, 01 Jan 2011 00:00:00 NZDT +13:00

Cela fonctionne également avec parse

Time.find_zone('Sydney').parse('2011-04-12 2pm')
=> Tue, 12 Apr 2011 14:00:00 EST +10:00

29voto

Nick Partridge Points 1108

Pour analyser une date dans un fuseau horaire spécifique, vous pouvez utiliser ActiveSupport::TimeZone

> ActiveSupport::TimeZone["Sydney"].parse("2011-04-12 2pm")
=> Tue, 12 Apr 2011 14:00:00 EST 10:00

La documentation de l'API TimeZone est disponible ici : http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-c-5B-5D

25voto

James Healy Points 3102

Voici ce que j'utilise :

Time.zone.local(2011, 4, 12, 14, 0)

7voto

David D. Points 11

Comme indiqué ci-dessus, pour créer une heure dans un fuseau horaire spécifique (par exemple, 4/10/2014 13:30 New York) :

@event.start_time = Time.find_zone('Eastern Time (US & Canada)').local(2014,4,10,13,30)
=> Thu, 10 Apr 2014 13:30:00 EDT -04:00 

@event.start_time.utc
=> 2014-04-10 17:30:00 UTC

Lorsqu'il est enregistré dans votre base de données, il sera converti en UTC (dans Postgres au moins si vous utilisez un type de timestamp dans votre migration), et lors d'un accès ultérieur, il sera affiché par rapport au fuseau horaire de l'application défini dans config/application.rb.

Pour afficher correctement l'heure locale, nous stockons également le nom du fuseau horaire (par exemple, "Eastern Time (US & Canada)") dans notre base de données. Ainsi, lorsque nous voulons imprimer l'heure dans nos vues, nous...

@event.start_time.in_time_zone(@event.timezone)
 => Thu, 10 Apr 2014 13:30:00 EDT -04:00 

Pour obtenir le fuseau horaire abrégé (par exemple, EST)

@event.start_time.in_time_zone(@event.timezone).zone
=> "EDT"

-2voto

dexter Points 6000

Pourquoi ne pas utiliser l'aide *in_time_zone* .

Time.now.in_time_zone('Sydney')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X