Module: CouchRest::Model::CoreExtensions::TimeParsing

Defined in:
lib/couchrest/model/core_extensions/time_parsing.rb

Instance Method Summary collapse

Instance Method Details

#parse_iso8601(string) ⇒ Object

Attemtps to parse a time string in ISO8601 format. If no match is found, the standard time parse will be used.

Times, unless provided with a time zone, are assumed to be in UTC.

Uses String#to_r on seconds portion to avoid rounding errors. Eg:

Time.parse_iso8601("2014-12-11T16:54:54.549Z").as_json
 => "2014-12-11T16:54:54.548Z"

See: bugs.ruby-lang.org/issues/7829


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/couchrest/model/core_extensions/time_parsing.rb', line 20

def parse_iso8601(string)
  if (string =~ /(\d{4})[\-|\/](\d{2})[\-|\/](\d{2})[T|\s](\d{2}):(\d{2}):(\d{2}(\.\d+)?)(Z| ?([\+|\s|\-])?(\d{2}):?(\d{2}))?/)
    # $1 = year
    # $2 = month
    # $3 = day
    # $4 = hours
    # $5 = minutes
    # $6 = seconds (with $7 for fraction)
    # $8 = UTC or Timezone
    # $9 = time zone direction
    # $10 = tz difference hours
    # $11 = tz difference minutes

    if $8 == 'Z' || $8.to_s.empty?
      utc($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_r)
    else
      new($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_r, "#{$9 == '-' ? '-' : '+'}#{$10}:#{$11}")
    end
  else
    parse(string)
  end
end