Как получить метку времени 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
И без пунктуации это сделало бы одно предложение, которое слишком длинным и не совсем синтаксически правильным, более четким.
Эмиль Врейдагс