【发布时间】:2011-03-20 23:49:53
【问题描述】:
在 Ruby 1.87 中我可以这样做:
Date.parse ("3/21/2011")
现在在 1.9.2 中我得到:
ArgumentError: 无效日期
有什么想法吗?
【问题讨论】:
-
@bensiu,docs 不能帮助解释问题或提供解决方法。
标签: ruby-on-rails ruby
在 Ruby 1.87 中我可以这样做:
Date.parse ("3/21/2011")
现在在 1.9.2 中我得到:
ArgumentError: 无效日期
有什么想法吗?
【问题讨论】:
标签: ruby-on-rails ruby
使用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 版本之间存在这种差异的原因。
【讨论】:
date/format.rb/_parse 方法,我没有看到任何检查语言环境信息的内容。该代码采用非美国格式并首先检查它,然后是美国。超出范围的月份值 (13-31) 会触发问题。最好的解决方案是知道日期来自哪个区域,然后以编程方式决定是在Date#strptime 中使用%m/%d/%y 还是%d/%m/%y 格式。
man locale 以获取更多信息。我不记得如何为 Windows 设置它,但它可以设置。
根据this bug report,解析mm/dd/yy 日期的功能在1.9 中被有意删除。 Ruby 的创造者 Yukihiro Matsumoto 说:
“dd/dd/dd”格式本身就很 文化依赖和模棱两可。它 在日本是 yy/mm/dd(和其他 国家),mm/dd/yy 在美国,dd/mm/yy 在欧洲国家,对吧?在一些 案例,你可以偶然告诉他们, 但我们不应该依赖运气 一般情况。我相信那是 解析此格式的原因被禁用 在 1.9 中。
正如 hansengel 建议的那样,您可以改用 Date.strptime。
【讨论】:
Date.parse('1/1/2001') 在Ruby 1.9.2-p180 中工作,并且出现在date.rb 源代码中呢? Date.parse('1/1/2001') #=> #<Date: 2001-01-01 (4903821/2,0,2299161)>, RUBY_VERSION #=> "1.9.2" Date.parse
Date#parse 仍然不可用。也许我在上面的帖子中误读了 Matz 的回复。如果不能使用Date#parse 来解析 mm/dd/yy 日期,他说的什么被删除了?
我一直难以用Date.parse 解析日期。我的解决方案是感谢chronic gem。我也喜欢另一个答案中的strptime 函数。
【讨论】:
我喜欢 american_date gem 来完成这个...
【讨论】:
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
【讨论】: