Как получить метку времени UTC в Ruby?


Ответы:


117
time = Time.now.getutc

Обоснование: На мой взгляд, временная метка - это именно то: момент времени. Это может быть точно представлено с помощью объекта. Если вам нужно что-то еще, скалярное значение, например, секунды с начала эпохи Unix, интервалы 100 нс с 1601 года или, возможно, строка для отображения или сохранения метки времени в базе данных, вы можете легко получить ее из объекта. Но это очень сильно зависит от вашего предполагаемого использования.

Утверждение, что «истинная временная метка - это количество секунд с начала эпохи Unix», немного пропускает точку, так как это один из способов представления момента времени, но также необходима дополнительная информация, чтобы даже знать, что вы имеете дело время, а не число. TimeОбъект решает эту проблему , хорошо представляя точку во времени , а также четкое разъяснение, что это такое .


93
Это дает объект времени, вы должны Time.now.to_i для истинной отметки времени
— rafamvc

3
По моему мнению, объект достаточно временен, и у вас все еще есть вся необходимая вам свобода. Уменьшение его до скалярного значения в большинстве случаев не является действительно необходимым.
— Джои

2
Отметки времени относятся к эпохе - не имеет значения, в каком часовом поясе вы находитесь. Ответ Манжикова - лучший.
— Райан Мор

2
Хотя это хорошее объяснение того, почему не следует использовать метку времени Unix, это не отвечает на вопрос OP (равно как и на тот же вопрос, который у меня был, когда я обнаружил этот пост). Временные метки Unix требуются во многих случаях (например, для API). Даже после объяснения этот ответ не дал фактического способа получить метку времени.
— Stuckj

5
@stuckj, ни в коем случае вопрос не упоминает метку времени Unix. Я просто продолжаю получать отрицательные отзывы за этот ответ, потому что люди, кажется, думают, что »timestamp == Unix time«, отсюда и объяснение.
— Джои

247

Вы можете использовать: Time.now.to_i.


1
Будет ли больше смысла делать Time.now.getutc.to_i? Или это по сути эквивалентно?
— stuckj

20
временная метка одинакова во всех часовых поясах. :)
— Манжиков

2
О да, да. Мозговой вопрос. :)
— stuckj

это самый подходящий ответ!
— Дарлан Дитрих

46

Форматирование по умолчанию не очень полезно, на мой взгляд. Я предпочитаю ISO8601, так как он сортируется, относительно компактен и широко известен:

>> require 'time'
=> true
>> Time.now.utc.iso8601
=> "2011-07-28T23:14:04Z"

1
Обратите внимание, что этот метод исходит из ActiveSupport, а не из стандартной библиотеки rubydoc.info/docs/rails/ActiveSupport%2FTimeWithZone:iso8601
— n0nick

3
@ n0nick ты уверен, даже в 2.0? Я знаю, что использовал его на «ванильных» установках без рельсов и т /usr/share/ruby/2.0/time.rb. Д.
— Тим Сильвестр

15

Обычно у отметки времени нет часового пояса.

% irb
> Time.now.to_i == Time.now.getutc.to_i
=> true

1
to_fбудет лучше
— xis

1
зависит от ситуации.
— Юки Мацукура

1
Когда же временная метка имеет часовой пояс?
— Деннис

1
временная метка не связана с часовым поясом. Другими словами, меткой времени является UTC.
— Юки Мацукура

1
@YukiMatsukura На самом деле, это тоже не совсем точно. Отметка времени даже не представляет какой-либо часовой пояс, поэтому «отметка времени - это UTC», равно как и «отметка времени - слон». Проблема в представлении. Большинство разработчиков представляют его как метку времени Unix (которая не указывает UTC или любой другой часовой пояс, поскольку это просто целочисленное значение).
— Pellmeister

10

если вам нужна удобочитаемая временная метка (как у рельсовых миграций) ex. " 20190527141340 "

Time.now.utc.to_formatted_s(:number)  # using Rails

Time.now.utc.strftime("%Y%m%d%H%M%S") # using Ruby

7

Что хорошего в метке времени с ее детализацией в секундах? Я считаю гораздо более практичным работать с Time.now.to_f. Черт возьми, вы можете даже бросить , to_s.sub('.','')чтобы избавиться от десятичной точки, или выполнить приведение типа , как это: Integer(1e6*Time.now.to_f).


Спасибо. Я использовал это: Integer(1e3*Time.now.to_f)так, чтобы моя временная метка на стороне сервера была такой же, как и на стороне клиента javascriptDate.now()
— joshweir


-2

time = Time.zone.now()

Это будет работать как

irb> Time.zone.now
=> 2017-12-02 12:06:41 UTC

Джонатан, можешь сказать мне, что не так в этом ответе?
— Звездочка

1
Это зависит от того, какие вещи в Ruby являются местным часовым поясом. Это будет работать, как ожидается, только если локальный TZ UTC.
— MasterCheffinator

-6

Правильный способ состоит в том, Time.now.getutc.to_iчтобы получить правильную величину метки времени, поскольку простое отображение целого числа не всегда должно совпадать с меткой времени utc из-за разницы часовых поясов.


7
Все остальные так сказали, так зачем просто копировать без новой информации, с опозданием на 3 года?
— Каспар Ли

2
И без пунктуации это сделало бы одно предложение, которое слишком длинным и не совсем синтаксически правильным, более четким.
— Эмиль Врейдагс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.