Ruby的ISO-8601日期解析是否有完整的实现?

时间:2010-09-03 11:06:46

标签: ruby datetime iso8601

Time.iso8601方法是ISO-8601的受限子集。

  • 有什么限制?
  • 有没有人知道Ruby的完整实现?我正在使用MRI 1.8.7。

更新

看起来没有一个类可以处理所有各种8601日期和日期/时间组合。但是,我设法通过使用Date.parseTime.iso8601方法解决了这些问题。缺点是您需要在代码中决定输入是看起来像日期还是日期/时间。

警告:时区差异

Time.iso8601Time.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

之间的差异

This document触及ISO-8601中的内容与Ruby支持的内容之间的差异。简短的回答是可能的格式数量受到限制。

2 个答案:

答案 0 :(得分:15)

是的,但不幸的是它在Ruby 1.9中。

require "date"

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

我不相信Ruby 1.8.7有任何实现(或者至少我找不到任何实现)。您可以尝试升级到Ruby 1.9,从1.9.2开始它非常稳定。或者,您可以尝试自己解析日期。

答案 1 :(得分:10)

要将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。