Ruby 1.87 vs 1.92 Date.parse

时间:2011-03-20 23:49:54

标签: ruby-on-rails ruby

在Ruby 1.87中,我可以做到:

Date.parse ("3/21/2011")

现在在1.9.2我得到:

  

ArgumentError:无效日期

有什么想法吗?

5 个答案:

答案 0 :(得分:60)

使用strptime并提供特定的时间格式。

ruby-1.9.2-p136 :022 > Date.strptime '03/21/2011', '%m/%d/%Y'
 => #<Date: 2011-03-21 (4911283/2,0,2299161)>

请参阅michaelmichael's response了解Ruby版本之间差异的原因。

答案 1 :(得分:26)

根据this bug report,有意删除了解析mm/dd/yy日期的能力。 Ruby的创始人Yukihiro Matsumoto说:

  

“dd / dd / dd”格式本身非常   文化依赖和模棱两可。它   在日本是yy / mm / dd(和其他   国家),美国的mm / dd / yy,dd / mm / yy   在欧洲国家,对吧?在一些   你可以偶然告诉他们,   但我们不应该依靠运气   一般情况。我相信那就是   解析此格式的原因已禁用   在1.9。

正如hansengel建议的那样,您可以使用Date.strptime代替。

答案 2 :(得分:2)

我一直难以使用Date.parse解析日期。我的解决方案是chronic gem的慷慨解囊。我也喜欢在另一个答案中找到的strptime函数。

答案 3 :(得分:2)

我喜欢american_date宝石来完成这个......

答案 4 :(得分:1)

  class << self
    def parse_with_us_format(date, *args)
      if date =~ %r{^\d+/\d+/(\d+)$}
        Date.strptime date, "%m/%d/#{$1.length == 4 || args.first == false ? '%Y' : '%y'}"
      else
        parse_without_us_format(date, *args)
      end
    end
    alias_method_chain :parse, :us_format
  end