2010-02-25 20 views
9

पर पार्सिंग तिथियां मुझे 100k या तो रिकॉर्ड का बैच मिला है जो मैं रेल ऐप में आयात कर रहा हूं।एक रेल के अनुकूल प्रारूप

वहाँ प्रत्येक पंक्ति निम्न प्रकार फ़ॉर्मेट में एक तारीख है: 03/17/81

हालांकि, जब मैं सिर्फ एक दिनांक फ़ील्ड निर्दिष्ट करने के लिए प्रयास करते हैं, यह इस प्रकार परिवर्तित हो जाता है:

ruby-1.8.7-p174 > "03/17/81".to_date 
=> Sat, 17 Mar 0081 

अंत में मैं होता परिणामस्वरूप 1981-03-17

क्या यह आयात पर सबसे अच्छा किया जाएगा या मुझे अपनी रेल कॉन्फ़िगरेशन में ओवरराइड करना चाहिए, जिस तारीख को मुझे आवश्यक प्रारूप में दिनांक मानक सेट करना है और रेल 2.3.5 में सही दृष्टिकोण क्या है ?

+0

कैसे आप इम्प करना इनके लिए? आपके पास http://apidock.com/ruby/Date/strptime/class –

+0

मेरे पास एक आयात स्क्रिप्ट है जिसे मैं स्क्रिप्ट/धावक के माध्यम से चला रहा हूं और डेटा को पार्स करने के लिए FasterCSV का उपयोग कर रहा हूं और सरल ActiveRecord दिनांक डालने के लिए बनाता है। – mwilliams

+1

फिर निश्चित रूप से उस स्क्रिप्ट में अपना 'स्ट्रिपटाइम' डालें। –

उत्तर

19

उपयोग

d = Date.strptime("03/17/81", "%m/%d/%y") 

यह 1981/03/17 प्रयोग में बाहर निकलने के लिए:

d.to_s 

Date Rubydoc देखें। http://seanbehan.com/ruby-on-rails/custom-date-formats-for-your-rails-application/

एक फ़ाइल config/initializers/date_formats.rb

बनाएं ... इस युक्त:

+0

कार्य का परिणाम परिणाम: 0081-03-17 –

+1

ध्यान दें कि 1 9 6 9 से पहले की तारीखों के लिए, इसका परिणाम गलत सदी में होगा: 'date.strptime ("12/31/68", "% m /% d /% y ") '31 दिसंबर, 2068 में परिणाम। –

+1

क्या आपको irb में' date 'की आवश्यकता थी? इसके अलावा% y केस संवेदनशील है, इसे कम मामला होना चाहिए, ऊपरी मामले का मतलब 4 अंकों का है। – TheClair

1

जीर्ण का प्रयास करें (मणि पुरानी स्थापित):

require 'rubygems' 
require 'chronic' 
puts Chronic.parse "03/17/81" 
#=> Tue Mar 17 12:00:00 -0800 1981 

रिटर्न ए टाइम इन वस्तु।

+2

कोड के कुछ पंक्तियों के साथ आप एक सरल ऑपरेशन करने के लिए एक जेम क्यों स्थापित करना चाहिए? –

+5

क्योंकि एक बार यह स्थापित हो जाने पर, यह केवल 2 लाइनें है। और यह * बहुत * लचीला है। – Ben

0

रेल मत बदलें, अपना कोड बदलें। मुझे ऐसी विधि बनाने में कोई समस्या नहीं दिख रही है जो स्ट्रिंग को उपयुक्त दिनांक में परिवर्तित कर दे।

string = "03/17/81" 
date = if string =~ %r{(\d+)/(\d+)/(\d+)} 
    Date.parse("19#{$3}-#{$1}-#{$2}") 
else 
    nil # failover 
end 
+0

जो मेरा पहला विचार भी था :) –

+1

हम 2000 के दशक में एक दशक हैं। – Ben

+0

@ बेन वास्तव में, कोड को कुछ बदलावों की आवश्यकता हो सकती है। प्रश्न ने 20xx तिथियों के बारे में कोई आवश्यकता निर्धारित नहीं की है। –

3

यह करने के लिए उचित तरीके से, आप कई स्थानों में प्रारूप पुन: उपयोग करने जा रहे हैं कुछ इस तरह करना है

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
    :short_date => "%Y/%m/%d" 
) 

तो फिर तुम देखना चाहिए:

ruby-1.8.7-p174 > date = "03/17/81".to_date 
ruby-1.8.7-p174 > date.to_s(:short_date) 
#=> "1981/03/17" 
संबंधित मुद्दे