horario - operaciones con fechas ruby
¿Cómo calculo el desplazamiento, en horas, de una zona horaria dada desde UTC en ruby? (1)
Necesito calcular el desplazamiento, en horas, de una zona horaria dada desde UTC en Ruby. Esta línea de código había estado funcionando para mí, o al menos eso pensé:
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_offset).to_f / 3600.0
Pero resultó que me estaba devolviendo la compensación estándar, no el desplazamiento DST. Entonces, por ejemplo, supongamos
self.timezone = "America/New_York"
Si ejecuto la línea anterior, offset_in_hours = -5, no -4 como debería, dado que la fecha de hoy es el 1 de abril de 2012.
¿Alguien puede aconsejarme cómo calcular offset_in_hours desde UTC dado un string válido TimeZone en Ruby que da cuenta tanto del horario estándar como del horario de verano?
¡Gracias!
Actualizar
Aquí hay algunos resultados de IRB. Tenga en cuenta que Nueva York está 4 horas por detrás de UTC, no 5, debido a los ahorros de luz diurna:
>> require ''tzinfo''
=> false
>> timezone = "America/New_York"
=> "America/New_York"
>> offset_in_hours = TZInfo::Timezone.get(timezone).current_period.utc_offset / (60*60)
=> -5
>>
Esto sugiere que hay un error en TZInfo o que no es consciente de dst
Actualización 2
Según los comentarios de joelparkerhender, el error en el código anterior es que estaba usando utc_offset, no utc_total_offset.
Por lo tanto, según mi pregunta original, la línea correcta de código es:
offset_in_hours = (TZInfo::Timezone.get(self.timezone).current_period.offset.utc_total_offset).to_f / 3600.0
Sí, usa TZInfo así:
require ''tzinfo''
tz = TZInfo::Timezone.get(''America/Los_Angeles'')
Para obtener el período actual:
current = tz.current_period
Para saber si el horario de verano está activo:
current.dst?
#=> true
Para obtener la compensación base de la zona horaria de UTC en segundos:
current.utc_offset
#=> -28800 which is -8 hours; this does NOT include daylight savings
Para obtener el horario de verano compensado de la hora estándar:
current.std_offset
#=> 3600 which is 1 hour; this is because right now we''re in daylight savings
Para obtener la compensación total de UTC:
current.utc_total_offset
#=> -25200 which is -7 hours
La compensación total de UTC es igual a utc_offset + std_offset.
Esta es la compensación de la hora local en la que está vigente el horario de verano, en segundos.