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:
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.