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

min*_*eow 81 ruby timestamp ruby-on-rails

我有一个UTC时间戳

"2010-10-25 23:48:46 UTC"

我需要将其转换为ISO 8601

"2010-10-29 06:09Z"

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

Rya*_*igg 173

我想你是想骗我们的.

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

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

现在回答真实的答案.

首先是一个小小的事实:Ruby中的ISO 8601输出类似于ISO 8601维基百科页面的"组合日期和时间"输出.

你有一个字符串,所以你需要将它转换成一个Time你可以做的对象to_time.然后,只需调用iso8601该对象即可获得ISO 8601版本:

"2010-10-25 23:48:46 UTC".to_time.iso8601
Run Code Online (Sandbox Code Playgroud)

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

  • @Mark Thomas:是的,应该是幽默.他提供的输入和输出时间永远不会匹配.Tricksie小霍比特人! (9认同)
  • 很好的答案,但我没有得到第一部分(那应该是幽默?) (7认同)
  • 该死的!你通过我的情节看到了欺骗你们的人.= P感谢您的回答,我想知道他们为什么不在文档中写出来! (5认同)

Ste*_*ley 21

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

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

  • 良好的纯红宝石溶液.只想添加,如果原始时间不是UTC,你可能想要这个:`Time.parse("...").utc.iso8601`,另外你会得到时间后缀为`+03:00`或者取决于时区原始时间字符串的其他值.我是指而不是'Z`. (5认同)

小智 6

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

正确程序:

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

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 
Run Code Online (Sandbox Code Playgroud)