Bolo
Bolo

Reputation: 2778

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

Upvotes: 62

Views: 92346

Answers (5)

Jellicle
Jellicle

Reputation: 30206

For a UTC time in ISO 8601:

require 'date'
DateTime.now.new_offset(0).iso8601
# => "2022-04-15T16:33:17+00:00"

(This works even outside of Rails.)

Upvotes: 3

Guss
Guss

Reputation: 32315

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.

Upvotes: 28

adamc
adamc

Reputation: 1395

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"

Upvotes: 55

matias
matias

Reputation: 87

Did you try with Date?

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

For today, it would be:

Date.today.iso8601

Upvotes: 7

davidrac
davidrac

Reputation: 10738

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)

Upvotes: 66

Related Questions