2011-10-17 7 views
0

ルビーのDate.parseで、誰かが光を当てることができるかどうか疑問に思っています。Rubyで異常Date.parse

今日の日付が、私はそれがスラッシュ対ハイフンを解釈だかわからない2011年10月17日

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" 

です。スラッシュの振る舞いは私には完全に意味があります。しかし、ハイフンの動作は奇妙です。ハイフンの場合、何を解析していますか?

答えて

3

Date.parseは内部メソッドを使用していますあなたがここに見ることができる、_parseと呼ばれる:

http://www.ruby-doc.org/stdlib-1.9.2/libdoc/date/rdoc/Date.html#method-c-_parse

あなたが前に年置けば、あなたの最後の例は動作します:

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

場合、これは理にかなっていますデフォルトの引数はDate.parseです。これはstr='-4712-01-01'です。 1年もないハイフンは奇妙なもので、個人的には使用しません。

+0

ありがとうございました。 "parse"の説明は、あなたが意味する日付を把握するための "ヒューリスティック"アルゴリズムを適用すると言います。 mm-dd形式はおそらく一般的ではないと私は同意しますが、ヒューリスティックなアルゴリズムが "9-20"の意味を決定する上で非常に正確ではありませんでした。それは私にとってあいまいではないようです。私は2011年9月20日か2020年9月1日かを予想していただろう。しかし、2011-10-20は私を驚かせました。 – lurker

1

chronic gemをご利用ください。