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

202

¿Cómo obtendría 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_idevuelve una marca de tiempo, pero hacer Date#to_timey luego obtener la marca de tiempo da como resultado algo que está apagado por aproximadamente un mes (no estoy seguro de por qué ...).

Cualquier ayuda es apreciada, gracias!

Editar: OK, creo que lo descubrí: estaba procesando una fecha varias veces en un bucle, y cada vez que la fecha se movió un poco debido a una falta de coincidencia de zona horaria, lo que finalmente provocó que mi marca de tiempo estuviera un mes libre. Aún así, me interesaría saber si hay alguna manera de hacer esto sin depender Date#to_time.

igul222
fuente

Respuestas:

350

El código date.to_time.to_idebería funcionar bien. La sesión de consola de Rails a continuación 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 hora local, por lo que la marca de tiempo puede estar varias horas fuera de lo esperado. Si desea trabajar en horario UTC, puede usar el método "to_utc" de DateTime.

David Grayson
fuente
3
DateTime no tieneto_utc
Green
12
date.to_time.utces probablemente lo que quiso decir.
Adam Eberlin
3
En Rails, a través de ActiveSupport, una instancia de DateTime tiene un método utc () (también alias a getutc)
Gokul
71

Recibo lo siguiente cuando lo intento:

>> 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 Dateno almacena las horas, minutos o segundos de la hora actual. La conversión de a Datea Timedará como resultado ese día, medianoche.

Ryan Bigg
fuente
9

Las opciones sugeridas de usar to_utco utcpara corregir el desplazamiento de hora local no funcionan. Para mí, el uso 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

... tan claramente que llamar to_iva a dar la marca de tiempo incorrecta.

Gerry
fuente
8

Solución para Ruby 1.8 cuando tienes 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"
Nowaker
fuente
4
DateTime.new(2012, 1, 15).to_time.to_i
wang sky
fuente