Подтвердить что ты не робот

Преобразование временной метки UTC в ISO 8601 в Ruby

У меня есть метка времени, которая находится в UTC

"2010-10-25 23:48:46 UTC"

Мне нужно преобразовать его в ISO 8601

"2010-10-29 06: 09Z"

Документация сбивает с толку как ад - что это самый простой способ сделать это?

4b9b3361

Ответ 1

Я думаю, вы пытаетесь обмануть нас.

Дата ввода на ваш вопрос - 25 октября 2010 года, а выход - 29th октября 2010 года. Хорошо сыграл!

Продолжая этот нит-выбор: ваши времена также совершенно разные, и вам не хватает секунд с момента выхода.

Теперь для истинного ответа.

Вначале небольшой факт: выход ISO 8601 в Ruby похож на вывод "Комбинированные даты и времени" из ISO 8601, страница Wikipedia.

У вас есть строка, поэтому вам нужно будет преобразовать ее в объект Time, который вы можете сделать с помощью to_time. Тогда просто вопрос вызова iso8601 на этом объекте для получения версии ISO 8601:

"2010-10-25 23:48:46 UTC".to_time.iso8601

Метод to_time любезно предоставлен Rails, а iso8601 является придворной стандартной библиотекой Ruby.

Ответ 2

После долгих экспериментов я нахожу, что парсер Time Library лучше, чем DateTime, хотя причины меня избегают в данный момент. С этим предостережением я всегда использую Time, а не DateTime для такого рода вещей, и рубиновая документация также трудно понять, почему это так,

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"

Ответ 3

Примечание: вам нужно преобразовать (разбор) временную строку во временный объект, прежде чем вы сможете применить метод 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"