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

Есть ли полная реализация для синтаксического анализа даты ISO-8601 для Ruby?

Метод Time.iso8601 является ограниченным подмножеством ISO-8601.

  • Каковы его ограничения?
  • Кто-нибудь знает о полной реализации Ruby? Я использую MRI 1.8.7.

Update

Похоже, что нет ни одного класса, который обрабатывал бы все различные комбинации даты и даты и времени 8601. Однако мне удалось обойти проблемы, используя методы Date.parse и Time.iso8601. Недостатком является то, что вам нужно определить в коде, будет ли вход выглядеть как дата или дата/время.

Предупреждение: Разница в часовых поясах

Time.iso8601 и Time.parse ведут себя по-другому.

>> Time.parse("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 18:27:00 +0100 2010

>> Time.iso8601("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 17:27:00 UTC 2010

Различия между Time.iso8601 и ISO-8601

Этот документ затрагивает различия между тем, что находится в ISO-8601, и тем, что поддерживается Ruby. Короткий ответ заключается в том, что количество возможных форматов ограничено.

4b9b3361

Ответ 1

Да, но, к сожалению, это в Ruby 1.9.

require "date"

Date.iso8601("2010-W32-5").strftime
#=> "2010-08-13" 

Я не верю, что для Ruby 1.8.7 реализованы какие-либо реализации (или, по крайней мере, я не смог найти их). Вы можете либо попытаться перейти на Ruby 1.9, что довольно стабильно с 1.9.2. Кроме того, вы можете сами проанализировать даты.

Ответ 2

Чтобы преобразовать дату ISO8601 в локальный часовой пояс, сделайте следующее:

dt1 = Time.parse("2010-09-06T12:27:00.10-05:00")

Чтобы преобразовать дату ISO8601 в UTC, сделайте следующее:

dt2 = Time.iso8601("2010-09-06T12:27:00.10-05:00")

Если вы сравниваете даты, возвращаемые вышеуказанными запросами, они будут идентичны (т.е. dt1 === dt2). Однако доступ к компонентам даты (например, год, месяц, день, час и т.д.) Возвратит значения, соответствующие часовому поясу (UTC или local). То же самое относится к strftime.