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

Chr*_*ley 21 ruby datetime iso8601

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
Run Code Online (Sandbox Code Playgroud)

Time.iso8601和ISO-8601之间的差异

本文档涉及ISO-8601中的内容与Ruby支持的内容之间的差异.简短的回答是可能的格式数量受到限制.

mol*_*olf 17

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

require "date"

Date.iso8601("2010-W32-5").strftime
#=> "2010-08-13" 
Run Code Online (Sandbox Code Playgroud)

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


小智 10

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

dt1 = Time.parse("2010-09-06T12:27:00.10-05:00")
Run Code Online (Sandbox Code Playgroud)

要将ISO8601日期转换为UTC,请执行以下操作:

dt2 = Time.iso8601("2010-09-06T12:27:00.10-05:00")
Run Code Online (Sandbox Code Playgroud)

如果比较上述查询返回的日期,它们将是相同的(即dt1 === dt2).但是,访问日期组件(如年,月,日,小时等)将返回适合时区的值(UTC或本地).这同样适用于strftime.