Есть ли полная реализация для синтаксического анализа даты 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. Короткий ответ заключается в том, что количество возможных форматов ограничено.
Ответы
Ответ 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.