Pergunta

Como eu poderia obter um timestamp UNIX (número de segundos desde 1970 GMT) de um objeto Date em um aplicativo de Rails?

Eu sei Time#to_i retorna um timestamp, mas fazendo Date#to_time e, em seguida, obtendo os resultados timestamp em algo que está fora por cerca de um mês (não sei porquê ...).

Qualquer ajuda é apreciada, obrigado!

Edit: OK, acho que percebi isso out- eu estava processando uma data várias vezes em um loop, e cada vez que a data foi transferida um pouco devido a uma incompatibilidade de fuso horário, levando a minha timestamp ser um mês de folga . Ainda assim, eu estaria interessado em saber se há alguma maneira de fazer isso sem depender de Date#to_time.

Foi útil?

Solução

O date.to_time.to_i código deve funcionar bem. A sessão de console 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

Note que o objeto DateTime intermediário está na hora local, de modo que o timestamp poderia ser um várias horas fora do que você espera. Se você quer trabalhar em tempo UTC, você pode usar o método "to_utc" do DateTime.

Outras dicas

Eu recebo a seguinte quando eu experimentá-lo:

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

A diferença entre esses dois números é devido ao fato de que Date não armazena as horas, minutos ou segundos do tempo atual. Convertendo um Date a um Time resultará naquele dia, meia-noite.

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

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

As opções sugeridas do uso to_utc ou utc para corrigir a diferença horária local não funciona. Para mim, eu encontrei usando Time.utc() funcionou corretamente eo 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

Eis o que acontece quando você chamar 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

... chamando tão claramente to_i vai dar a hora errada.

DateTime.new(2012, 1, 15).to_time.to_i
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top