Есть ли полная реализация для разбора даты ISO-8601 для Ruby? - PullRequest
20 голосов
/ 03 сентября 2010

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

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

Обновление

Похоже, не существует ни одного класса, который обрабатывал бы все различные 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.Короткий ответ: количество возможных форматов ограничено.

Ответы [ 2 ]

15 голосов
/ 03 сентября 2010

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

require "date"

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

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

10 голосов
/ 28 сентября 2011

Чтобы преобразовать дату 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 или местный).То же самое относится и к strftime.

...