Tengo un registro foo
en la base de datos que tiene :start_time
y :timezone
atributos.
El :start_time
es un tiempo en UTC - 2001-01-01 14:20:00
, por ejemplo. El :timezone
es una cadena - America/New_York
, por ejemplo.
Quiero crear un nuevo objeto Time con el valor de :start_time
pero cuya zona horaria está especificada por :timezone
. No quiero cargar el :start_time
y luego convertir a :timezone
, porque Rails será inteligente y actualizará la hora de UTC para que sea consistente con esa zona horaria.
Actualmente,
t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t.in_time_zone("America/New_York")
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
En cambio, quiero ver
=> Sat, 01 Jan 2000 14:20:00 EST -05:00
es decir. Quiero hacer:
t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST
Respuestas:
Parece que quieres algo como
Esto dice que convierta esta hora local (usando la zona) a utc. Si lo ha
Time.zone
configurado, puede, por supuesto,Esto no usará la zona horaria adjunta a t, asume que es local a la zona horaria desde la que está convirtiendo.
Un caso extremo para protegerse aquí son las transiciones de horario de verano: la hora local que especifique puede no existir o puede ser ambigua.
fuente
Time.use_zone(self.timezone) { Time.zone.local_to_utc(t) }.localtime
Acabo de enfrentar el mismo problema y esto es lo que voy a hacer:
Aquí está la documentación sobre asctime
fuente
asctime
es que elimina los valores de subsegundos (que mi respuesta mantiene).Si está utilizando Rails, aquí hay otro método similar a la respuesta de Eric Walsh:
fuente
.in_time_zone
hasta el final.Time.zone.now
por algo que esté más cerca de la hora que desea cambiar?Debe agregar la compensación de tiempo a su tiempo después de convertirlo.
La forma más sencilla de hacerlo es:
No estoy seguro de por qué querría hacer esto, aunque probablemente sea mejor trabajar con los tiempos de la forma en que están construidos. Supongo que sería útil contar con algunos antecedentes sobre por qué necesita cambiar la hora y las zonas horarias.
fuente
Time.in_time_zone
requiriendo las partes correctas de active_support:require 'active_support/core_ext/time'
En realidad, creo que debe restar el desplazamiento después de convertirlo, como en:
fuente
Depende de dónde vaya a utilizar este tiempo.
Cuando tu tiempo es un atributo
Si se usa el tiempo como atributo, puede usar la misma gema date_time_attribute :
Cuando estableces una variable separada
Utilice la misma gema date_time_attribute :
fuente
Se me ocurrió una pequeña función rápida para resolver el trabajo. Si alguien tiene una forma más eficiente de hacer esto, ¡publíquelo!
fuente
La premisa del OP es incorrecta: "No quiero cargar: start_time y luego convertir a: timezone, porque Rails será inteligente y actualizará la hora de UTC para que sea coherente con esa zona horaria". Esto no es necesariamente cierto, como lo demuestra la respuesta proporcionada aquí.
fuente
t.zone
antes,t.change
¿qué ves? ¿Y cuando correst.zone
detrást.change
? ¿Y a qué parámetros estás pasandot.change
exactamente?He creado algunos métodos auxiliares, uno de los cuales hace lo mismo que el autor original de la publicación en Ruby / Rails: cambiar la zona horaria de una hora, sin cambiar el valor .
También he documentado algunas peculiaridades que observé y también estos ayudantes contienen métodos para ignorar por completo el ahorro automático de luz diurna aplicable mientras que las conversiones de tiempo no están disponibles de forma inmediata en el marco de Rails:
Ejemplos que se pueden probar en la consola de rieles o en un script ruby después de envolver los métodos anteriores en una clase o módulo:
Espero que esto ayude.
fuente
Aquí hay otra versión que funcionó mejor para mí que las respuestas actuales:
Transfiere nanosegundos usando "% N". Si desea otra precisión, consulte esta referencia de tiempo de ejecución .
fuente
También pasé mucho tiempo luchando con TimeZones, y después de jugar con Ruby 1.9.3 me di cuenta de que no es necesario convertir a un símbolo de zona horaria con nombre antes de convertir:
Lo que esto implica es que puede concentrarse en obtener la configuración de tiempo adecuada primero en la región que desea, de la forma en que lo pensaría (al menos en mi cabeza lo particiono de esta manera), y luego convertir al final a la zona con el que desea verificar su lógica empresarial.
Esto también funciona para Ruby 2.3.1.
fuente