Як отримати часову позначку UTC у Ruby?


Відповіді:


117
time = Time.now.getutc

Обгрунтування: В моїх очах часова марка - це саме те, що: момент у момент. Це можна точно представити об’єктом. Якщо вам потрібно щось інше, скалярне значення, наприклад секунди з часу епохи Unix, інтервали 100 ns з 1601 року або, можливо, рядок для цілей відображення або зберігання часової позначки в базі даних, ви можете легко отримати це від об'єкта. Але це дуже залежить від призначення.

Скажімо, що "справжня мітка часу - це кількість секунд з часу епохи Unix", трохи не вистачає точки, оскільки це один із способів подання моменту в часі, але також потрібна додаткова інформація, щоб навіть знати, що ви маєте справу час, а не число. TimeОб'єкт вирішує цю проблему , добре представляючи точку в часі , а також чітке роз'яснення, що це таке .


93
Це дає об’єкт часу, ви повинні Time.now.to_i для справжньої часової позначки
rafamvc

3
На мій погляд, об’єкт достатньо часовий, і ви все ще маєте всю необхідну вам свободу. Звести його до скалярного значення в більшості випадків насправді не потрібно.
Джої

2
Тимчасові позначки відносно епохи - не має значення в якому часовому поясі ви знаходитесь. Відповідь манджикова - краща.
Ryan Mohr

2
Хоча приємне пояснення того, чому не використовувати часову позначку unix, це не відповідає на питання ОП (ні на те саме запитання, яке було у мене, коли я знайшов цю посаду). Часові позначки Unix потрібні у багатьох випадках (наприклад, для API). Навіть після пояснення ця відповідь не дала фактичного способу отримати позначку часу.
stuckj

5
@stuckj, в жодному разі питання не згадує часову позначку Unix. Я просто продовжую отримувати відповіді на цю відповідь, тому що люди, здається, думають, що "timetamp == час Unix", звідси і пояснення.
Джої

247

Ви можете використовувати: Time.now.to_i.


1
Чи було б більше сенсу робити Time.now.getutc.to_i? Або це по суті рівнозначно?
stuckj

20
позначка часу однакова у всіх часових поясах. :)
manzhikov

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 чи будь-який інший часовий пояс, оскільки це просто ціле значення).
The Pellmeister

10

якщо вам потрібна зрозуміла для людини часова мітка (як, наприклад, міграція рейок), наприклад " 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)так, щоб мітка часу рубіну на моєму сервері була такою ж, як JavaScript на стороні клієнтаDate.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
І без пунктуації, яка б зробила 1 речення, яке є занадто довгим і не зовсім синтаксично правильним, зрозумілішим.
Emile Vrijdags
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.