2011-03-20 76 views
47

在Ruby 1.87我可以這樣做:紅寶石VS 1.87 1.92 Date.parse

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

現在1.9.2,我得到:

ArgumentError: invalid date

任何想法?

+4

@bensiu,在[文檔](http://rubydoc.info/stdlib/date/1.9.2/Date#parse-class_method )無助於解釋問題或提供解決方法。 – 2011-03-21 02:32:41

回答

60

使用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

+0

只是好奇,但你會如何設置紅寶石的區域? – mgm8870 2011-03-21 00:03:56

+0

看起來像你可以使用ActiveSupport的日期擴展:http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html – 2011-03-21 00:11:50

+1

從看日期'date/format.rb/_parse'方法,我沒有看到任何檢查區域設置信息。該代碼採用非美國格式並首先進行檢查,然後是美國。超出範圍的月份值(13-31)觸發該問題。最好的解決方案是知道日期來自哪個區域,然後以編程方式決定是否在Date#strptime中使用'%m /%d /%y'或'%d /%m /%y'格式。 – 2011-03-21 02:29:10

2

我一直很難用Date.parse解析日期。我的解決方案是令人難以置信的chronic gem。我也喜歡在另一個答案中找到的strptime函數。

25

根據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代替。

+0

有趣。那麼爲什麼'Date.parse('1/1/2001')'在Ruby 1.9.2-p180中工作,並出現在date.rb源代碼中? 'Date.parse('1/1/2001')#=>#','RUBY_VERSION#=>「1.9.2」'[ Date.parse'](http://rubydoc.info/stdlib/date/1.9.2/Date#parse-class_method) – 2011-03-21 02:15:56

+0

@ The Tin Man,即將第一個解析爲當天,第二個解析爲一個月(日/月/年格式)。你只是不能說,因爲他們是相同的數字;) – 2011-03-21 05:21:52

+0

@michaelmichael,感謝您找到真正的原因。我更新了我的答案以引用您的答案,以便接受的答案具有一切正確性。 – 2011-03-21 05:28:12

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 
2

我喜歡american_date寶石完成這個...

+0

爲什麼這個解決方案感覺很髒?我試圖修改我的代碼以使用Time.strptime(...),但遇到了JQuery datepicker和PostgreSQL數據庫格式的級聯問題。浪費時間。但是,寶石完美的工作......只是覺得骯髒和骯髒......期待這個問題在未來再次出現! – vanboom 2013-06-22 23:00:57

+0

@vanboom是的,這有點奇怪,但是這個寶石的作者是Ruby日期的權威,所以如果他寫了一個寶石,顯然是必要的。 – Dex 2013-07-19 23:39:45