У мене є мітка часу в UTC
"2010-10-25 23:48:46 UTC"
Мені потрібно перетворити його на ISO 8601
"2010-10-29 06: 09Z"
Документація, як пекло, заплутана - який найпростіший спосіб це зробити?
Відповіді:
Я думаю, ти намагаєшся нас обдурити.
Дата введення вашого запитання - 25 жовтня 2010 року , тоді як вихідна - 29 жовтня 2010 року . Гарно зіграно!
Продовжуючи цю нитку збору ніт: ваш час також абсолютно інший, і ви втрачаєте секунди від вихідного часу.
Тепер за правдивою відповіддю.
Спочатку трохи фактично: вихідний файл ISO 8601 у Ruby подібний до "Комбінованої дати та часу", виведеного на сторінці Вікіпедії ISO 8601 .
У вас є рядок, і тому вам потрібно буде перетворити його в Timeоб’єкт, з яким ви можете зробити to_time. Тоді справа лише в тому, щоб зателефонувати iso8601цьому об’єкту, щоб отримати версію ISO 8601:
"2010-10-25 23:48:46 UTC".to_time.iso8601
to_timeМетод люб'язно Rails, в той час як iso8601люб'язно стандартної бібліотеки Рубі.
Після довгих експериментів я вважаю, що синтаксичний аналізатор бібліотеки Time кращий за DateTime, хоча на даний момент причини мені не вдаються. Зважаючи на це застереження, я завжди використовую Time, а не DateTime для такого роду речей, і в рубіновій документації також важко проаналізувати, чому це так,
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601otherwize ви отримаєте час з суфіксом +03:00або якесь інше значення, залежно від часового поясу, в якому вказано початковий рядок часу. Я маю на увазі замість Z.
Примітка: перед застосуванням методу to_time вам потрібно перетворити (проаналізувати) рядок часу в об’єкт часу.
ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
from (irb):16
Правильна процедура:
irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")
irb> ut.iso8601
=> "2010-10-25T23:48:46+00:00"
Додавання відповіді на це надзвичайно старе запитання, тому що якщо ви використовуєте Rails, немає необхідності перетворювати / аналізувати його так, як кажуть вам інші відповіді тут:
created_atабо updated_atатрибут), ви можете безпосередньо викликати iso8601метод на цій мітці часу (наприклад, object.created_at.iso8601).iso8601Метод також приймає числовий аргумент для відображення цифр дробової частини; ви б використали це, якщо хочете, 2020-04-06T19:16:55.604Zа не 2020-04-06T19:16:55Z.https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601