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

Posted

技术标签:

【中文标题】在 Ruby 中将 UTC 时间戳转换为 ISO 8601【英文标题】:Converting UTC timestamp to ISO 8601 in Ruby 【发布时间】:2011-05-02 16:53:04 【问题描述】:

我的时间戳是 UTC

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

我需要将其转换为 ISO 8601

“2010-10-29 06:09Z”

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

【问题讨论】:

【参考方案1】:

我认为你想欺骗我们。

您问题的输入日期是 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 标准库提供。

【讨论】:

很好的答案,但我没有得到第一部分(这应该是幽默吗?) 该死!你看穿了我欺骗你们的阴谋。 =P 感谢您的出色回答,我想知道他们为什么不把它写在文档中! @Mark Thomas:是的,它应该是幽默的。他给出了一个永远不会匹配的输入和输出时间。狡猾的小霍比特人! 这行得通,但是虽然他的问题是问如何在 ruby​​ 中做到这一点,但它并没有假设它是在 rails 环境中。 相关,感谢您将我指向 'to_time' ~ Time.now.iso8601 格式,如“2010-10-25T23:48:46Z”,如果您想改用“+00:00” 'Z' (我不得不为旧系统) Time.now.to_time.iso8601 似乎这样做。【参考方案2】:

经过多次试验,我发现 Time 库的解析器比 DateTime 更好,尽管目前我没有想到原因。有了这个警告,我总是使用 Time 而不是 DateTime 来处理这类事情,而且 ruby​​ 文档也很难理解为什么会这样,

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

【讨论】:

良好的纯红宝石溶液。只是想补充一下,如果原始时间不是 UTC,您可能想要这个:Time.parse("...").utc.iso8601,否则您将获得以+03:00 为后缀的时间或其他值,具体取决于给出的时区原始时间字符串。我的意思是而不是Z【参考方案3】:

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

【讨论】:

【参考方案4】:

为这个超级老问题添加一个答案,因为如果您使用的是 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

【讨论】:

以上是关于在 Ruby 中将 UTC 时间戳转换为 ISO 8601的主要内容,如果未能解决你的问题,请参考以下文章

无法在模板中将 UTC 时间戳转换为本地时间

如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?

如何在scala中将ISO 8601时间戳转换为unix时间戳?

在 Synapse 中将时间戳从字符串转换为 EST 时间

在Java中将ISO 8601时间戳字符串转换为纪元秒[重复]

Ruby:将unix时间戳转换为日期[重复]