我有UTC的时间戳
“ 2010-10-25 23:48:46 UTC”
我需要将其转换为ISO 8601
“ 2010-10-29 06:09Z”
该文档令人困惑,这是最简单的方法吗?
Answers:
我想您是在欺骗我们。
您的问题的输入日期是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的标准库提供。
经过大量的实验,我发现时间库的解析器比DateTime更好,尽管目前的原因使我无法幸免。需要注意的是,我总是使用Time而不是DateTime来进行此类操作,而ruby文档也很难理解为什么会这样,
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601
需要这样做:,否则您将获得带后缀的时间+03:00
或其他一些值,具体取决于给定原始时间字符串的时区。我的意思不是Z
。
注意:必须先将时间字符串转换(解析)为时间对象,然后才能应用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"
为这个超级老问题添加一个答案,因为如果您使用的是Rails,则无需按照此处其他答案告诉您的方式进行转换/解析:
created_at
或updated_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