Как конвертировать метку времени Unix (секунды с начала эпохи) в Ruby DateTime?
369
DateTime.strptime
может справиться с секундами с эпохи. Число должно быть преобразовано в строку:
require 'date'
DateTime.strptime("1318996912",'%s')
%Q
.Time
нужно вместоDateTime
. Так что используйтеTime.strptime("1318996912345",'%Q').to_f
и вы увидите миллисекунды сохраненными, покаDateTime.strptime("1318996912345",'%Q').to_f
не сохраните их.Извините, краткий момент провала синапса. Вот реальный ответ.
Краткий пример (учитывает текущий часовой пояс системы):
Дальнейшее обновление (для UTC):
Недавнее обновление : я тестировал лучшие решения в этой теме, работая над сервисом высокой доступности неделю или две назад, и был удивлен, обнаружив, что он
Time.at(..)
превосходит результатыDateTime.strptime(..)
(обновление: добавлено больше тестов).источник
Time.at
выигрываетDateTime.strptime
. Последний должен анализировать строку, которая обычно намного медленнее, чем непосредственное получение числа.DateTime.strptime
потому что он создает две новые строки на каждую итерацию, что очень дорого. Это не просто разбор строк, как сказалОбработка часового пояса
Я просто хочу уточнить, хотя это было прокомментировано, чтобы будущие люди не пропустили это очень важное различие.
отображает возвращаемое значение в UTC и требует, чтобы секунды были строкой, и выводит объект времени UTC, тогда как
отображает возвращаемое значение в часовом поясе LOCAL; обычно для этого требуется аргумент FixNum, но сам объект Time по-прежнему находится в формате UTC, даже если отображение отсутствует.
Поэтому, несмотря на то, что я передал одно и то же целое число обоим методам, я, похоже, получил два разных результата из-за того, как
#to_s
работает метод класса . Однако, как @Eero пришлось дважды напомнить мне о:Сравнение равенства между двумя возвращаемыми значениями все еще возвращает true. Опять же, это потому, что значения в основном одинаковы (хотя разные классы,
#==
метод позаботится об этом за вас), но#to_s
метод печатает радикально разные строки. Хотя, если мы посмотрим на строки, мы увидим, что они действительно одинакового времени, просто напечатаны в разных часовых поясах.Метод Аргумент Разъяснение
В документах также говорится: «Если задан числовой аргумент, результат указывается по местному времени». это имеет смысл, но меня немного смутило, потому что они не приводят примеров нецелых аргументов в документах. Итак, для некоторых примеров нецелых аргументов:
Вы не можете использовать аргумент String, но вы можете использовать аргумент Time в,
Time.at
и он вернет результат в часовом поясе аргумента:Ориентиры
После обсуждения с @AdamEberlin его ответа я решил опубликовать слегка измененные тесты, чтобы все было как можно более одинаково. Кроме того, я никогда не хочу строить их снова, так что это лучшее место для их спасения.
Time.at (int) .to_datetime ~ в 2,8 раза быстрее
**** отредактировано, чтобы не быть полностью и полностью неверным во всех отношениях ****
**** добавлены ориентиры ****
источник
Time.at(1318996912) == DateTime.strptime("1318996912",'%s')
в не-UTC часовом поясе, и вы увидите!Time.use_zone "Samoa" do Time.at(1318996912) == DateTime.strptime("1318996912",'%s') end
чтобы убедиться, что времена равны, нет локальной метки времени, и в обоих случаях метка времени Unix интерпретируется как UTC.Time.at
представляет результирующий объект Time в местном часовом поясе иDateTime.strptime
представляет результирующий объект DateTime в UTC, но независимо от представления они равны, поскольку являются эквивалентным моментом времени.Time.at(1318996912) # => 2011-10-19 00:01:52 -0400
утверждение отображает возвращаемое значение в местном часовом поясе, кажется, не является точным ... Можете ли вы проверить? Я полагаю, что ваше утверждение было бы правдой только в том случае, если бы вы использовалиTime.zone.at(1318996912)
Одна команда для преобразования даты в формат Unix, а затем в строку
наконец, strftime используется для форматирования даты
Пример:
источник
Time.now.utc.to_i
.Здесь указывается дата количества секунд в будущем с момента выполнения кода.
ставит (время)
в соответствии с текущим временем я отвечаю на вопрос, который он печатает
047-05-14 05:16:16 +0000
(1 миллиард секунд в будущем)или если вы хотите считать миллиард секунд за определенное время, это в формате
Time.mktime(year, month,date,hours,minutes)
ставит («Мне было бы 1 миллиард секунд на:» + время)
источник
Если вы хотели просто дату, вы можете сделать,
Date.strptime(invoice.date.to_s, '%s')
гдеinvoice.date
приходит в видеFixnum
и затем преобразован вString
.источник
Time.at(1500923406).to_date.to_s
=>"2017-07-24"