Как получить метку времени 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.