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

202

Как получить метку времени UNIX (количество секунд с 1970 по Гринвичу) из объекта Date в приложении Rails?

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

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

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

igul222
источник

Ответы:

350

Код 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".

Дэвид Грейсон
источник
3
DateTime не имеетto_utc
Зеленый
12
date.to_time.utcвероятно, он имел в виду.
Адам Эберлин
3
В Rails через ActiveSupport экземпляр DateTime действительно имеет метод utc () (также с псевдонимом getutc)
Гокул
71

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

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

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

Райан Бигг
источник
9

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

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

против

> 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будет давать неправильную метку времени.

Gerry
источник
8

Решение для 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"
Nowaker
источник