Ruby / Rails: convertir una fecha en una marca de tiempo UNIX


¿Cómo obtengo una marca de tiempo UNIX (número de segundos desde 1970 GMT) de un objeto Date en una aplicación Rails?

Sé que Time#to_i devuelve una marca de tiempo, pero hacer Date#to_time y luego obtener la marca de tiempo resulta en algo que está apagado por aproximadamente un mes (no estoy seguro de por qué...).

Cualquier ayuda es apreciada, gracias!

Editar: OK, creo que me di cuenta - Estaba procesando una fecha varias veces en un bucle, y cada vez que la fecha se movía un poco debido a una falta de coincidencia de zona horaria, en última instancia, lo que lleva a que mi marca de tiempo tenga un mes de descanso. Aún así, estaría interesado en saber si hay alguna manera de hacer esto sin depender de Date#to_time.

Author: igul222, 2009-11-27

5 answers

El código date.to_time.to_i debería funcionar bien. La siguiente sesión de consola de Rails muestra un ejemplo:

>> Date.new(2009,11,26).to_time
=> Thu Nov 26 00:00:00 -0800 2009
>> Date.new(2009,11,26).to_time.to_i
=> 1259222400
>> Time.at(1259222400)
=> Thu Nov 26 00:00:00 -0800 2009

Tenga en cuenta que el objeto DateTime intermedio está en la hora local, por lo que la marca de tiempo puede estar varias horas fuera de lo que espera. Si desea trabajar en hora UTC, puede utilizar el método de DateTime "to_utc".

 310
Author: David Grayson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 00:30:20

Obtengo lo siguiente cuando lo pruebo:

>> Date.today.to_time.to_i
=> 1259244000
>> Time.now.to_i
=> 1259275709

La diferencia entre estos dos números se debe al hecho de que Date no almacena las horas, minutos o segundos del tiempo actual. Convertir un Date a un Time resultará en ese día, medianoche.

 62
Author: Ryan Bigg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-26 22:49:33

Solución para Ruby 1.8 cuando se tiene un objeto DateTime arbitrario:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"
 7
Author: Nowaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-03 15:13:36

Las opciones sugeridas de usar to_utc o utc para fijar el desplazamiento de la hora local no funcionan. Para mí me encontré usando Time.utc() funcionó correctamente y el código implica menos pasos:

> Time.utc(2016, 12, 25).to_i
=> 1482624000 # correct

Vs

> Date.new(2016, 12, 25).to_time.utc.to_i
=> 1482584400 # incorrect

Esto es lo que sucede cuando llamas a utc después de usar Date....

> Date.new(2016, 12, 25).to_time
=> 2016-12-25 00:00:00 +1100 # This will use your system's time offset
> Date.new(2016, 12, 25).to_time.utc
=> 2016-12-24 13:00:00 UTC

Calling así que llamar claramente a to_i va a dar la marca de tiempo incorrecta.

 5
Author: Gerry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 07:33:16
DateTime.new(2012, 1, 15).to_time.to_i
 3
Author: wang sky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 11:19:56