Ruby / Rails: преобразование даты в метку времени UNIX

как бы я получил метку времени UNIX (количество секунд с 1970 GMT) от объекта даты в приложении Rails?

Я знаю Time#to_i возвращает метку времени, но делать Date#to_time а затем получение метки времени приводит к тому, что примерно на месяц (не знаю почему...).

любая помощь приветствуется, спасибо!

Edit: хорошо, я думаю, я понял это - я обрабатывал дату несколько раз в цикле, и каждый раз дата была немного перемещена из-за несоответствие часовых поясов, в конечном счете, приводит к тому, что моя метка времени-месяц. Тем не менее, мне было бы интересно узнать, есть ли способ сделать это, не полагаясь на Date#to_time.

5 ответов


код date.to_time.to_i должно работать нормально. Ниже приведен пример сеанса консоли Rails:

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

обратите внимание, что промежуточный объект DateTime находится в локальном времени, поэтому метка времени может быть в нескольких часах от ожидаемого. Если вы хотите работать во времени UTC, вы можете использовать метод DateTime "to_utc".


Я получаю следующее, Когда я пытаюсь это:

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

разница между этими двумя цифрами объясняется тем, что Date не сохраняет часы, минуты или секунды текущего времени. Преобразование Date до Time приведет в тот день, полночь.


решение для Ruby 1.8, когда у вас есть произвольный объект DateTime:

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

предлагаемые варианты использования to_utc или utc исправить локальное смещение времени не работает. Для меня я нашел использование Time.utc() работал правильно, и код включает в себя меньше шагов:

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

vs

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

вот что происходит, когда вы вызываете utc после использования 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

...так ясно зовет to_i собирается дать неправильную метку времени.


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