Ruby 中的时间 ISO 8601
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33262792/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Time ISO 8601 in Ruby
提问by Bolo
I am trying to return a date with this format
我正在尝试使用这种格式返回日期
2015-10-07T00:32:50.877+0000
2015-10-07T00:32:50.877+0000
I have tested that
我已经测试过了
Time.now.iso8601
=> "2015-10-21T09:47:50-04:00"
but i didn't have same format
但我没有相同的格式
tks
tks
回答by davidrac
You can use strftime yourself and create the format you want as described here
您可以自己使用 strftime 并按照此处所述创建所需的格式
The format you specified should be %Y-%m-%dT%H:%M:%S.%L%z
您指定的格式应该是 %Y-%m-%dT%H:%M:%S.%L%z
And so the complete Ruby statement would be Time.now.strftime('%Y-%m-%dT%H:%M:%S.%L%z')
所以完整的 Ruby 语句将是 Time.now.strftime('%Y-%m-%dT%H:%M:%S.%L%z')
Various ISO 8601 formats:
各种 ISO 8601 格式:
%Y%m%d => 20071119 Calendar date (basic)
%F => 2007-11-19 Calendar date (extended)
%Y-%m => 2007-11 Calendar date, reduced accuracy, specific month
%Y => 2007 Calendar date, reduced accuracy, specific year
%C => 20 Calendar date, reduced accuracy, specific century
%Y%j => 2007323 Ordinal date (basic)
%Y-%j => 2007-323 Ordinal date (extended)
%GW%V%u => 2007W471 Week date (basic)
%G-W%V-%u => 2007-W47-1 Week date (extended)
%GW%V => 2007W47 Week date, reduced accuracy, specific week (basic)
%G-W%V => 2007-W47 Week date, reduced accuracy, specific week (extended)
%H%M%S => 083748 Local time (basic)
%T => 08:37:48 Local time (extended)
%H%M => 0837 Local time, reduced accuracy, specific minute (basic)
%H:%M => 08:37 Local time, reduced accuracy, specific minute (extended)
%H => 08 Local time, reduced accuracy, specific hour
%H%M%S,%L => 083748,000 Local time with decimal fraction, comma as decimal sign (basic)
%T,%L => 08:37:48,000 Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L => 083748.000 Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L => 08:37:48.000 Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z => 083748-0600 Local time and the difference from UTC (basic)
%T%:z => 08:37:48-06:00 Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z => 20071119T083748-0600 Date and time of day for calendar date (basic)
%FT%T%:z => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z => 2007323T083748-0600 Date and time of day for ordinal date (basic)
%Y-%jT%T%:z => 2007-323T08:37:48-06:00 Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600 Date and time of day for week date (basic)
%G-W%V-%uT%T%:z => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M => 20071119T0837 Calendar date and local time (basic)
%FT%R => 2007-11-19T08:37 Calendar date and local time (extended)
%Y%jT%H%MZ => 2007323T0837Z Ordinal date and UTC of day (basic)
%Y-%jT%RZ => 2007-323T08:37Z Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z => 2007W471T0837-0600 Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z => 2007-W47-1T08:37-06:00 Week date and local time and difference from UTC (extended)
回答by adamc
If you just want to include the fractional number of seconds, you can use DateTime#iso8601([n=0]) → string:
如果只想包含秒的小数部分,可以使用DateTime#iso8601([n=0]) → string:
pry(main)> require 'date'
pry(main)> DateTime.now.iso8601(3)
=> "2017-01-17T12:31:26.695+11:00"
Or in Rails:
或者在 Rails 中:
pry(main)> Time.now.iso8601(3)
=> "2017-01-17T12:31:26.695+11:00"
回答by matias
Did you try with Date?
你试过日期吗?
Date.new(2018,5,25).iso8601 # returns "2018-05-25"
For today, it would be:
今天,它将是:
Date.today.iso8601
回答by Guss
It seems like the main issue is that you want the output to be UTC encoded ISO 8601 timestamp, while Ruby by default uses the timezone of the Timevalue - which is most likely, especially if you create the value using Time.now, your local time zone.
似乎主要问题是您希望输出是 UTC 编码的 ISO 8601 时间戳,而 Ruby 默认使用Time值的时区- 这很可能,特别是如果您使用Time.now本地时区创建值。
The solution would be to convert the Timevalue to a UTC timezone using utcmethod:
解决方案是Time使用以下utc方法将值转换为 UTC 时区:
var now = Time.now
puts now.utc.iso8601
This would output 2020-04-20T20:46:31Z- the Zthere is equivalent to +00:00and means UTC (or "Zulu time" in US military jargon). Any ISO-8601 compliant implementation should accept Zbeing identical to +00:00.
这将输出2020-04-20T20:46:31Z-Z相当于+00:00并表示 UTC(或美国军事术语中的“祖鲁时间”)。任何符合 ISO-8601 的实现都应该接受Z与+00:00.
Note:
笔记:
The iso8601method on the Timeinstance is an extension. It is part of the standard library, but you have to load it explicitly using require 'time'. This also loads other useful extensions for the Timeclass.
在iso8601对方法Time的实例是一个扩展。它是标准库的一部分,但您必须使用require 'time'. 这还会为Time该类加载其他有用的扩展。

