ruby on rails - metodo - Convierta UTC a la hora local en Rails 3
metodo times ruby (5)
Tengo problemas para convertir una Time
UTC o TimeWithZone
a la hora local en Rails 3.
El moment
decir es una variable de Time
en UTC (por ejemplo, moment = Time.now.utc
). ¿Cómo convierto el moment
a mi zona horaria y me ocupo del horario de verano (es decir, utilizando EST / EDT)?
Más precisamente, me gustaría imprimir "Lunes 14 de marzo, 9 a.m." si el horario corresponde a esta mañana a las 9 a.m. EDT y "Lunes 7 de marzo a las 9 a.m." si fue la hora del lunes a las 9 a.m. EST del lunes.
Espero que haya otra manera?
Editar : primero pensé que "EDT" debería ser una zona horaria reconocida, pero "EDT" no es una zona horaria real, más como el estado de una zona horaria. Por ejemplo, no tendría sentido pedir Time.utc(2011,1,1).in_time_zone("EDT")
. Es un poco confuso, ya que "EST" es una zona horaria real, utilizada en algunos lugares que no utilizan el horario de verano y son (UTC-5) de un año.
En realidad, hay una buena gema llamada local_time
por basecamp para hacer todo eso solo en el lado del cliente, creo:
Es fácil de configurar usando la zona local de su sistema, solo en su aplicación. Rb agregue esto
config.time_zone = Time.now.zone
Entonces, los rieles deben mostrar las marcas de tiempo en su tiempo local o puede usar algo como esta instrucción para obtener el tiempo local
Post.created_at.localtime
No sé por qué, pero en mi caso no funciona de la manera sugerida anteriormente. Pero funciona así:
Time.now.change(offset: "-3000")
Por supuesto, necesitas cambiar el valor de offset
al tuyo.
Rails tiene sus propios nombres. Véalos con:
rake time:zones:us
También puede ejecutar el rake time:zones:all
para todas las zonas horarias. Para ver más tareas de rake relacionadas con la zona: rake -D time
Por lo tanto, para convertir a EST, catering para DST automáticamente:
Time.now.in_time_zone("Eastern Time (US & Canada)")
Time#localtime
le dará la hora en la zona horaria actual de la máquina que ejecuta el código:
> moment = Time.now.utc
=> 2011-03-14 15:15:58 UTC
> moment.localtime
=> 2011-03-14 08:15:58 -0700
Actualización: si desea conversar a zonas horarias específicas en lugar de su propia zona horaria, está en la senda correcta. Sin embargo, en lugar de preocuparse por EST vs EDT, simplemente pase en la zona horaria del Este general: sabrá en función del día si es EDT o 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