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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 06:46:56  来源:igfitidea点击:

Time ISO 8601 in Ruby

rubydate-formatting

提问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该类加载其他有用的扩展。