2009-11-26 21 views
170

¿Cómo obtendré una marca de tiempo UNIX (número de segundos desde 1970 GMT) de un objeto Date en una aplicación de Rails?Ruby/Rails: conversión de una fecha a una marca de tiempo UNIX

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 en aproximadamente un mes (no estoy seguro de por qué ...).

¡Se agradece cualquier ayuda, gracias!

Editar: Bien, creo que lo resolví- Estaba procesando una fecha varias veces seguidas, y cada vez que la fecha se movía un poco debido a una falta de coincidencia de zona horaria, lo que finalmente llevó a que mi marca de tiempo fuera un mes apagado. Aún así, me interesaría saber si hay alguna forma de hacerlo sin confiar en Date#to_time.

Respuesta

295

El código date.to_time.to_i debería funcionar bien. La sesión de consola rieles siguiente 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 intermedia está en hora local, por lo que la marca de tiempo podría ser un varias horas fuera de lo que espera. Si desea trabajar en horario UTC, puede utilizar el método de DateTime "to_utc".

+2

DateTime no tiene 'to_utc' – Green

+10

' date.to_time.utc' es probablemente lo que quería decir. –

+3

En Rails, a través de ActiveSupport, una instancia de DateTime tiene un método utc() (también con alias de getutc) – Gokul

59

me sale el siguiente, cuando lo intento:

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

La diferencia entre estas dos cifras se debe al hecho de que Date no almacena las horas, minutos o segundos de la hora actual. La conversión de Date a Time dará como resultado ese día, medianoche.

7

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

1.8.7-p374 :001 > require 'date' 
=> true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s') 
=> "1326585600" 
3
DateTime.new(2012, 1, 15).to_time.to_i 
5

Las opciones sugeridas de la utilización de to_utc o utc para fijar el desplazamiento no funciona hora local. Para mí encontré usando Time.utc() funcionado 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 ocurre cuando se llama 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 

... llamando claramente to_i va a dar t la marca de tiempo incorrecta.

Cuestiones relacionadas