105 votes

Convertir UTC en heure locale dans Rails 3

Je vais avoir du mal à convertir un format UTC Time ou TimeWithZone de l'heure locale de Rails 3.

Dire moment certains Time variable en UTC (par exemple, moment = Time.now.utc). Comment puis-je convertir moment de mon temps à la zone, en prenant soin de l'heure d'été (c'est à dire à l'aide de HNE/HAE)?

Plus précisément, j'aimerais impression "lundi 14 Mars, de 9 h" si le temps correspondent à ce matin à 9 h (HAE) et "lundi 7 Mars, de 9 h" si le temps était à 9 h HNE lundi dernier.

J'espère qu'il y a un autre moyen?

Edit: j'ai d'abord pensé que "HAE" doit être reconnue comme un fuseau horaire, mais "HAE" n'est pas une véritable fuseau horaire, de plus en plus comme l'état d'un fuseau horaire. Par exemple, il ne ferait aucun sens de demander de l' Time.utc(2011,1,1).in_time_zone("EDT"). C'est un peu déroutant, comme "EST" est un véritable fuseau horaire, utilisé dans quelques endroits qui n'utilisent pas l'heure d'été et sont (UTC-5) an.

133voto

Dylan Markow Points 65796

Time#localtime vous donnera l'heure dans le fuseau horaire actuel de la machine qui exécute le code:

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

Mise à jour: Si vous voulez conver à spécifique zones de temps plutôt que votre propre fuseau horaire, vous êtes sur la bonne voie. Cependant, au lieu de se soucier de la HE vs HAE, il suffit de passer dans le général, Heure de l'est -- il se base sur le jour qu'il est (HAE) ou de l'est:

> 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 

118voto

Zabba Points 26372

Rails a son propre nom. Voir: rake time:zones:us Pour voir d'autres de la zone liées râteau tâches: rake -D time

Donc, pour convertir à l'EST, de la restauration de l'heure d'été automatiquement:

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

15voto

mahatmanich Points 1812

Il est en fait un beau BIJOU appelé local_time par basecamp pour faire tout cela sur le côté client seulement, je crois:

https://github.com/basecamp/local_time

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