Time ISO 8601 in Ruby

I am trying to return a date with this format

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


Solution 1:

You can use strftime yourself and create the format you want as described here

The format you specified should be %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')

Various ISO 8601 formats:

%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)

Solution 2:

If you just want to include the fractional number of seconds, you can use 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:

pry(main)> Time.now.iso8601(3)
=> "2017-01-17T12:31:26.695+11:00"

Solution 3:

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 Time value - which is most likely, especially if you create the value using Time.now, your local time zone.

The solution would be to convert the Time value to a UTC timezone using #utc method:

now = Time.now
# convert to UTC and format
puts now.utc.iso8601

This would output 2020-04-20T20:46:31Z - the Z there is equivalent to +00:00 and means UTC (or "Zulu time" in US military jargon). Any ISO-8601 compliant implementation should accept Z being identical to +00:00.

Note:

The iso8601 method on the Time instance 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 Time class.

Solution 4:

Did you try with Date?

Date.new(2018,5,25).iso8601 # returns "2018-05-25"

For today, it would be:

Date.today.iso8601