web-dev-qa-db-fra.com

Conversion du temps UTC en heure locale dans Rails 3

Je ne parviens pas à convertir un UTC Time ou TimeWithZone en heure locale dans Rails 3.

Disons que moment est une variable Time en UTC (par exemple, moment = Time.now.utc). Comment convertir moment dans mon fuseau horaire en prenant en compte l'heure d'été (c'est-à-dire en utilisant EST/EDT)?

Plus précisément, j'aimerais imprimer "lundi 14 mars à 9 heures" si l'heure correspond à 9 heures HAE ce matin et "lundi 7 mars à 9 heures" s'il était 9 heures HNE lundi dernier.

Espérons qu'il y a un autre moyen?

Edit: j'ai d'abord pensé que "EDT" doit être un fuseau horaire reconnu, mais que "EDT" n'est pas un fuseau horaire réel, mais plutôt l'état d'un fuseau horaire. Par exemple, demander Time.utc(2011,1,1).in_time_zone("EDT") n'aurait aucun sens. C'est un peu déroutant, car "EST" est un fuseau horaire réel, utilisé dans quelques endroits qui n'utilisent pas l'heure d'été et qui sont (UTC-5) toute l'année.

90

Rails a ses propres noms. Les voir avec:

rake time:zones:us

Vous pouvez également exécuter rake time:zones:all pour tous les fuseaux horaires . Pour voir plus de tâches de rake liées aux zones: rake -D time

Donc, pour convertir en EST, la restauration automatique à l’heure d’été:

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

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 souhaitez effectuer la conversion vers des fuseaux horaires spécifiques plutôt que vers votre propre fuseau horaire, vous êtes sur la bonne voie. Cependant, au lieu de vous inquiéter de l'EST contre l'EDT, passez dans le fuseau horaire général de l'Est - il saura, selon le jour, s'il s'agit de l'EST 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 
107
Dylan Markow

Il y a en fait un joyau appelé local_time par basecamp pour faire tout cela uniquement côté client, je crois:

https://github.com/basecamp/local_time

15
mahatmanich

Il est facile de le configurer en utilisant la zone locale de votre système, .__, juste dans votre application.rb, ajoutez ceci

config.time_zone = Time.now.zone

Ensuite, Rails devrait vous montrer les horodatages dans votre heure locale ou vous pouvez utiliser quelque chose comme cette instruction pour obtenir l'heure locale.

Post.created_at.localtime
10
jacr1614

Je ne sais pas pourquoi mais dans mon cas, cela ne fonctionne pas de la manière suggérée plus tôt .

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

Bien sûr, vous devez remplacer la valeur offset par la vôtre.

0
Seybo Glaux

Si vous le faites simplement parce que vous voulez obtenir le fuseau horaire de l'utilisateur, il vous suffit de changer de fuseau horaire dans votre config/applications.rb.

Comme ça:

Rails, par défaut, enregistrera votre enregistrement de temps en UTC même si vous spécifiez le fuseau horaire actuel.

config.time_zone = "Singapore"

C'est tout ce que vous avez à faire et vous êtes prêt à partir.

0
therealadrain