Convertir UTC en heure locale en Rails 3

J’ai du mal à convertir une Time UTC ou TimeWithZone en heure locale en Rails 3.

Say moment est une variable de Time en UTC (par exemple moment = Time.now.utc ). Comment puis-je convertir un moment dans mon fuseau horaire en prenant en charge l’heure d’été (c’est-à-dire en utilisant EST / EDT)?

Plus précisément, j’aimerais imprimer “lundi 14 mars à 9h” si l’heure correspond à ce matin à 9h HAE et à “lundi 7 mars à 9h” si l’heure était 9h HNE lundi dernier.

J’espère qu’il y a une autre façon?

Edit : J’ai d’abord pensé que “EDT” devrait être un fuseau horaire reconnu, mais “EDT” n’est pas un fuseau horaire réel, plus comme l’état d’un fuseau horaire. Par exemple, cela n’aurait aucun sens de demander Time.utc(2011,1,1).in_time_zone("EDT") . 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 (UTC-5) tout au long de l’année.

Rails a ses propres noms. Les voir avec:

 rake time:zones:us 

Vous pouvez également exécuter le 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 DST:

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

Time#localtime vous donnera l’heure dans le fuseau horaire actuel de la machine exécutant 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 converger 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 par rapport à l’EDT, passez simplement dans le fuseau horaire général de l’Est – il saura en fonction du jour s’il s’agit d’EDT ou d’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 

Il y a en fait un joli Gem appelé local_time par basecamp pour faire tout cela du côté client seulement, je crois:

https://github.com/basecamp/local_time

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, les rails doivent afficher les horodatages dans votre heure locale ou vous pouvez utiliser quelque chose comme cette instruction pour obtenir l’heure locale.

 Post.created_at.localtime 

Je ne sais pas pourquoi mais dans mon cas, cela ne fonctionne pas comme suggéré précédemment. Mais ça marche comme ça:

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

Bien sûr, vous devez modifier offset valeur de offset pour la vôtre.

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

Comme ça:

Rails, par défaut, sauvegardera 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 que vous êtes prêt à faire.