Ruby / Rails: convertendo uma data em um carimbo de data / hora UNIX

202

Como obter um registro de data e hora do UNIX (número de segundos desde 1970 GMT) de um objeto Date em um aplicativo Rails?

Eu sei que Time#to_iretorna um carimbo de data / hora, mas fazer Date#to_timee, em seguida, obtê-lo resulta em algo que está desativado em cerca de um mês (não sei por que ...).

Qualquer ajuda é apreciada, obrigado!

Edit: OK, eu acho que descobri - eu estava processando uma data várias vezes em um loop, e cada vez que a data era movida um pouco por causa de uma incompatibilidade de fuso horário, levando a minha data e hora a um mês de folga. Ainda assim, eu estaria interessado em saber se há alguma maneira de fazer isso sem depender deDate#to_time .

igul222
fonte

Respostas:

350

O código date.to_time.to_ideve funcionar bem. A sessão do console do Rails abaixo mostra um exemplo:

>> 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

Observe que o objeto DateTime intermediário está no horário local; portanto, o registro de data e hora pode estar a várias horas do esperado. Se você deseja trabalhar no horário UTC, pode usar o método DateTime "to_utc".

David Grayson
fonte
3
O DateTime não possui #to_utc
Green
12
date.to_time.utcprovavelmente é o que ele quis dizer.
precisa saber é o seguinte
3
No Rails, através ActiveSupport, uma instância de DateTime tem um método UTC () (também alias para getutc)
Gokul
71

Recebo o seguinte quando tento:

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

A diferença entre esses dois números se deve ao fato de Datenão armazenar as horas, minutos ou segundos da hora atual. Converter um Dateem um Timeresultará nesse dia, meia-noite.

Ryan Bigg
fonte
9

As opções sugeridas para usar to_utcou utccorrigir o deslocamento da hora local não funcionam. Para mim, achei que o uso Time.utc()funcionou corretamente e o código envolve menos etapas:

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

vs

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

Aqui está o que acontece quando você chama utc depois 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

... ligar com clareza to_ifornecerá o carimbo de data / hora errado.

Gerry
fonte
8

Solução para Ruby 1.8 quando você possui um objeto DateTime arbitrário:

1.8.7-p374 :001 > require 'date'
 => true 
1.8.7-p374 :002 > DateTime.new(2012, 1, 15).strftime('%s')
 => "1326585600"
Nowaker
fonte
4
DateTime.new(2012, 1, 15).to_time.to_i
céu wang
fonte