lurker lurker - 1 year ago 57
Ruby Question

Anomaly with Ruby Date.parse

I've found a strange behavior in Ruby's Date.parse wondering if someone could shed light on.

Today's date is 17 Oct 2011.

irb(main):027:0> Date.parse("11-20").to_s
=> "2011-10-11"
irb(main):028:0> Date.parse("11/20").to_s
=> "2011-11-20"
irb(main):029:0> Date.parse("1-20").to_s
=> "2011-10-20"
irb(main):032:0> Date.parse("1/20").to_s
=> "2011-01-20"
irb(main):030:0> Date.parse("9-20").to_s
=> "2011-10-20"
irb(main):035:0> Date.parse("9/20").to_s
=> "2011-09-20"
irb(main):031:0> Date.parse("9-10").to_s
=> "2011-10-10"
irb(main):033:0> Date.parse("9/10").to_s
=> "2011-09-10"
irb(main):042:0> Date.parse("1-20-1997").to_s
ArgumentError: invalid date
from /usr/lib/ruby/1.8/date.rb:956:in `new_by_frags'
from /usr/lib/ruby/1.8/date.rb:1000:in `parse'
from (irb):42
from /usr/lib/ruby/1.8/date.rb:1578
irb(main):043:0> Date.parse("1/20/1997").to_s
=> "1997-01-20"

I'm not sure how it's interpreting the hyphen versus the slash. The slash behavior makes perfect sense to me. But the hyphen behavior is odd. What's parse doing in the hyphen case?


Date.parse internally uses a method called _parse, which you can see here:

Your last example works if you put the year in front:

Date.parse("1997-1-20") #=> "1997-01-20"

This makes sense if you look at the default argument to Date.parse, which is str='-4712-01-01'. The hyphen form without a year is weird and I personally wouldn't use it.