28

The Time.iso8601 method is a restricted subset of ISO-8601.

  • What are its limitations?
  • Does anyone know of a full implementation for Ruby? I'm using MRI 1.8.7.

Update

It looks like there isn't a single class that handles all of the various 8601 date and date/time combinations. However, I have managed to work around the problems by using both the Date.parse and Time.iso8601 methods. The downside is that you need to decide in code whether the input looks like a date or a date/time.

Warning : Timezone differences

Time.iso8601 and Time.parse behave differently.

>> Time.parse("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 18:27:00 +0100 2010

>> Time.iso8601("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 17:27:00 UTC 2010

Differences between Time.iso8601 and ISO-8601

This document touches on the differences between what is in ISO-8601 and what is supported by Ruby. The short answer is that the number of possible formats is restricted.

Pops
  • 30,199
  • 37
  • 136
  • 151
Chris McCauley
  • 25,824
  • 8
  • 48
  • 65
  • 3
    Time.iso8601 doesn't seem to exist in Ruby 2.2.x. Any idea where it went? — Never mind, I didn't see that you only get it if you explicitly `require "time"`. – David Moles May 01 '15 at 19:07

2 Answers2

19

Yes, but unfortunately it's in Ruby 1.9.

require "date"

Date.iso8601("2010-W32-5").strftime
#=> "2010-08-13" 

I don't believe there are any implementations for Ruby 1.8.7 (or at least I couldn't find any). You could either try to upgrade to Ruby 1.9, which is pretty stable as of 1.9.2. Alternatively, you could try to parse the dates yourself.

molf
  • 73,644
  • 13
  • 135
  • 118
  • Nice! Parses almost everything I tried throwing at it, except reduced times patterns (e.g. hour only `2014-05-31T16`), and same with fractional hours/minutes (`2014-05-31T16:26.1Z`). – Beni Cherniavsky-Paskin Sep 26 '16 at 19:06
16

To convert an ISO8601 date into the local time zone, do this:

require "time"
dt1 = Time.parse("2010-09-06T12:27:00.10-05:00")

To convert an ISO8601 date into UTC, do this:

dt2 = Time.iso8601("2010-09-06T12:27:00.10-05:00")

If you compare the dates returned by the above queries, they will be identical (i.e. dt1 === dt2). However, accessing date components (like year, month, day, hour, etc.) will return values appropriate for the time zone (either UTC or local). The same applies to strftime.

lulalala
  • 17,572
  • 15
  • 110
  • 169
Pete
  • 161
  • 1
  • 2