在Ruby中将UTC时间戳转换为ISO 8601

时间:2010-10-30 02:39:45

标签: ruby-on-rails ruby timestamp

我的时间戳是UTC

“2010-10-25 23:48:46 UTC”

我需要将其转换为ISO 8601

“2010-10-29 06:09Z”

文档令人困惑如此 - 最简单的方法是什么?

4 个答案:

答案 0 :(得分:169)

我认为你试图欺骗我们。

您问题的输入日期是 2010年10月25日,而输出是2010年10月的 第29次 。好好玩!

继续这个挑选线程:你的时间也完全不同,你错过了输出时间的秒数。

现在回答真实的答案。

首先是一个小小的事实:Ruby中的ISO 8601输出类似于ISO 8601's Wikipedia page的“组合日期和时间”输出。

您有一个字符串,因此您需要将其转换为Time对象,您可以使用to_time。然后,只需在该对象上调用iso8601即可获得ISO 8601版本:

"2010-10-25 23:48:46 UTC".to_time.iso8601

to_time方法是由Rails提供的,而iso8601是由Ruby的标准库提供的。

答案 1 :(得分:20)

经过多次实验,我发现Time库的解析器比DateTime更好,虽然原因让我目前无法理解。有了这个警告,我总是使用Time而不是DateTime来处理这类东西,并且ruby文档也很难理解为什么会这样,

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"

答案 2 :(得分:2)

注意:在应用to_time方法之前,必须将时间字符串转换(解析)为时间对象。

ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
    from (irb):16

正确的程序:

irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 

答案 3 :(得分:1)

为此超级老问题添加答案,因为如果您使用的是Rails,则无需按照此处其他答案告诉您的方式进行转换/解析:

  • 如果已经是时间戳记(例如created_atupdated_at属性),则可以直接在该时间戳记上调用iso8601方法(例如, object.created_at.iso8601)。
  • iso8601方法还接受数字参数来显示小数位数;如果您想使用2020-04-06T19:16:55.604Z而不是2020-04-06T19:16:55Z,则可以使用它。

https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601