26

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

  • 它的局限性是什么?
  • 有人知道 Ruby 的完整实现吗?我正在使用 MRI 1.8.7。

更新

看起来没有一个类可以处理所有各种 8601 日期和日期/时间组合。但是,我已经设法通过使用Date.parseTime.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 支持的内容之间的区别。简短的回答是可能的格式数量受到限制。

4

2 回答 2

18

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

require "date"

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

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

于 2010-09-03T12:03:20.970 回答
14

要将 ISO8601 日期转换为本地时区,请执行以下操作:

require "time"
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。

于 2011-09-27T23:08:37.093 回答