Ruby Date.parse的异常

时间:2011-10-17 21:33:58

标签: ruby date

我在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"

我不确定它是如何解释连字符和斜线的。斜线行为对我来说非常有意义。但连字符行为很奇怪。在连字符案例中做什么解析?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可能希望使用chronic gem。