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


85

我有UTC的时间戳

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

我需要将其转换为ISO 8601

“ 2010-10-29 06:09Z”

该文档令人困惑,这是最简单的方法吗?

Answers:


185

我想您是在欺骗我们。

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

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

现在是真正的答案。

首先要注意一点:Ruby中的ISO 8601输出类似于ISO 8601的Wikipedia页面上的“组合日期和时间”输出。

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

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

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


7
好的答案,但是我没有得到第一部分(是幽默吗?)
马克·托马斯

5
该死的!您通过我的情节看到了欺骗你们的人。= P感谢您的出色回答,我想知道为什么他们不只是将其写在文档中!
铭耀

13
@马克·托马斯:是的,这应该是幽默。他提供了前所未有的输入和输出时间。特里西小霍比特人!
Ryan Bigg

这行得通,但是尽管他的问题询问如何在红宝石中进行操作,但并没有认为它是在铁路环境中进行的。
courtsimas 2015年

1
相关,感谢您为我指定“ to_time”〜Time.now.iso8601格式,例如“ 2010-10-25T23:48:46Z”,如果您想使用“ +00:00”而不是“ Z”(我曾经到旧系统),Time.now.to_time.iso8601似乎可以做到这一点。
lucygenik

21

经过大量的实验,我发现时间库的解析器比DateTime更好,尽管目前的原因使我无法幸免。需要注意的是,我总是使用Time而不是DateTime来进行此类操作,而ruby文档也很难理解为什么会这样,

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

5
好的纯红宝石溶液。只是要添加,如果原始时间不是UTC,则可能Time.parse("...").utc.iso8601需要这样做:,否则您将获得带后缀的时间+03:00或其他一些值,具体取决于给定原始时间字符串的时区。我的意思不是Z
akostadinov

4

注意:必须先将时间字符串转换(解析)为时间对象,然后才能应用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" 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.