Ruby/Рельсы:преобразование даты в временную метку UNIX
-
05-07-2019 - |
Вопрос
Как я могу получить временную метку UNIX (количество секунд с 1970 по Гринвичу) из объекта Date в приложении Rails?
Я знаю Time#to_i
возвращает временную метку, но выполняет Date#to_time
и затем получение временной метки приводит к тому, что она отключается примерно на месяц (не уверен, почему ...).
Любая помощь приветствуется, спасибо!
Редактировать:Хорошо, я думаю, я понял это - я обрабатывал дату несколько раз в цикле, и каждый раз дата немного сдвигалась из-за несоответствия часового пояса, что в конечном итоге привело к тому, что моя временная метка была отклонена на месяц.Тем не менее, мне было бы интересно узнать, есть ли какой-нибудь способ сделать это, не полагаясь на Date#to_time
.
Решение
Код 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
против
> 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