在Ruby 1.87我可以這樣做:紅寶石VS 1.87 1.92 Date.parse
Date.parse ("3/21/2011")
現在1.9.2,我得到:
ArgumentError: invalid date
任何想法?
在Ruby 1.87我可以這樣做:紅寶石VS 1.87 1.92 Date.parse
Date.parse ("3/21/2011")
現在1.9.2,我得到:
ArgumentError: invalid date
任何想法?
使用strptime
並給出具體的時間格式。
ruby-1.9.2-p136 :022 > Date.strptime '03/21/2011', '%m/%d/%Y'
=> #<Date: 2011-03-21 (4911283/2,0,2299161)>
爲Ruby版本之間的這種差異的原因見michaelmichael's response。
只是好奇,但你會如何設置紅寶石的區域? – mgm8870 2011-03-21 00:03:56
看起來像你可以使用ActiveSupport的日期擴展:http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html – 2011-03-21 00:11:50
從看日期'date/format.rb/_parse'方法,我沒有看到任何檢查區域設置信息。該代碼採用非美國格式並首先進行檢查,然後是美國。超出範圍的月份值(13-31)觸發該問題。最好的解決方案是知道日期來自哪個區域,然後以編程方式決定是否在Date#strptime中使用'%m /%d /%y'或'%d /%m /%y'格式。 – 2011-03-21 02:29:10
我一直很難用Date.parse
解析日期。我的解決方案是令人難以置信的chronic
gem。我也喜歡在另一個答案中找到的strptime
函數。
根據this bug report,解析mm/dd/yy
日期的能力在1.9中有意刪除。 Ruby的創造者,松本行弘說:
"dd/dd/dd" format itself is very culture dependent and ambiguous. It is yy/mm/dd in Japan (and other countries), mm/dd/yy in USA, dd/mm/yy in European countries, right? In some cases, you can tell them by accident, but we should not rely on luck in general cases. I believe that is the reason parsing this format is disabled in 1.9.
由於hansengel建議,您可以使用Date.strptime
代替。
有趣。那麼爲什麼'Date.parse('1/1/2001')'在Ruby 1.9.2-p180中工作,並出現在date.rb源代碼中? 'Date.parse('1/1/2001')#=>#
@ The Tin Man,即將第一個解析爲當天,第二個解析爲一個月(日/月/年格式)。你只是不能說,因爲他們是相同的數字;) – 2011-03-21 05:21:52
@michaelmichael,感謝您找到真正的原因。我更新了我的答案以引用您的答案,以便接受的答案具有一切正確性。 – 2011-03-21 05:28:12
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
我喜歡american_date寶石完成這個...
@bensiu,在[文檔](http://rubydoc.info/stdlib/date/1.9.2/Date#parse-class_method )無助於解釋問題或提供解決方法。 – 2011-03-21 02:32:41