strf rails now ruby-on-rails ruby date timestamp

ruby-on-rails - now - rails timestamp to date



Ruby/Rails: conversión de una fecha a una marca de tiempo UNIX (5)

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

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

Cualquier ayuda es apreciada, gracias!

Editar: OK, creo que lo resolví: 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, lo que en última instancia llevó a que mi marca de tiempo fuera un mes libre. Aún así, me interesaría saber si hay alguna forma de hacerlo sin depender de la Date#to_time .


El código date.to_time.to_i debería funcionar bien. La sesión de la 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 más lejos de lo esperado. Si desea trabajar en horario UTC, puede utilizar el método de DateTime "to_utc".


Las opciones sugeridas para usar to_utc o utc para corregir el desplazamiento de hora local no funcionan. Para mí, encontré que usar Time.utc() funcionaba 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 la 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

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


Obtengo 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 Date no almacena las horas, minutos o segundos de la hora actual. La conversión de una Date a un Time dará como resultado ese día, medianoche.


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"


DateTime.new(2012, 1, 15).to_time.to_i