2011-03-20 12 views
47

मैं कर सकता रूबी 1.87 में:रूबी 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 चाहते) समस्या की व्याख्या करने में मदद न करें या इससे निपटने का कोई तरीका न दें। –

उत्तर

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 देखें।

+0

बस curios लेकिन आप रूबी के लिए लोकेल कैसे सेट करेंगे? – mgm8870

+0

ऐसा लगता है कि आप ActiveSupport के दिनांक एक्सटेंशन का उपयोग कर सकते हैं: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html –

+1

दिनांक की तारीख/format.rb को देखने से/_parse' विधि, मुझे लोकेल जानकारी की जांच करने के लिए कुछ भी नहीं दिख रहा है। कोड एक गैर-यूएस प्रारूप मानता है और इसके लिए पहले जांच करता है, उसके बाद यू.एस. के बाहर एक ऑफ-रेंज महीने मूल्य (13-31) समस्या को ट्रिगर करता है। सबसे अच्छा समाधान यह जानना है कि तारीख से कौन सा क्षेत्र आता है, प्रोग्रामेटिक रूप से निर्णय लेता है कि 'दिनांक # strptime' में '% m /% d /% y' या'% d /% m /% y' प्रारूप का उपयोग करना है या नहीं। –

2

मुझे Date.parse के साथ तारीखों को पार्स करने में कठिनाई होती है। मेरा समाधान chronic gem का आभारी है। मुझे strptime फ़ंक्शन को किसी अन्य उत्तर में भी पसंद है।

25

प्रति this bug report, mm/dd/yy दिनांकों को पार्स करने की क्षमता जानबूझकर 1.9 में हटा दी गई थी। रूबी के निर्माता, यूकिहिरो मैट्सुमोटो का कहना है:

"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 ') क्यों रूबी 1.9.2-पी 180 में काम करता है, और date.rb स्रोत कोड में दिखाई देता है? 'Date.parse ('1/1/2001') # => # <दिनांक: 2001-01-01 (4903821/2,0,2299161)>', 'RUBY_VERSION # => "1.9.2" '[' Date.parse'] (http://rubydoc.info/stdlib/date/1.9.2/Date#parse-class_method) –

+0

@ द टिन मैन, जो दिन के पहले 1 को पार्स कर रहा है, और दूसरा 1 महीने के रूप में (डीडी/मिमी/वाई प्रारूप)। आप बस इतना नहीं बता सकते हैं क्योंकि वे एक ही संख्या हैं;) –

+0

@ मिचेलमिचेल, इसके लिए वास्तविक कारण खोजने के लिए धन्यवाद। मैंने आपके उत्तर को संदर्भ में अपडेट किया है, ताकि स्वीकृत उत्तर में सबकुछ सही हो। –

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 डेटपिकर और PostgreSQL डेटाबेस स्वरूपों के साथ एक कैस्केडिंग समस्या में भाग गया। घंटे बर्बाद हो गए। लेकिन मणि पूरी तरह से काम करता है ... बस हैकिश और गंदे लगता है ... इस मुद्दे को भविष्य में फिर से उभरने की उम्मीद है! – vanboom

+0

@vanboom हाँ, यह थोड़ा अजीब है लेकिन उस मणि का लेखक रूबी तिथियों पर * प्राधिकरण है, इसलिए यदि वह एक मणि लिखता है तो यह स्पष्ट रूप से आवश्यक है। – Dex

संबंधित मुद्दे