2008-10-03 3 views
163

मैं प्रारूप में तिथियां प्रदर्शित करना चाहता हूं: सप्ताह का छोटा दिन, छोटा महीना, महीने के दिन शून्य के बिना, लेकिन "वें", "सेंट", "एनडी", या "rd" प्रत्यय सहित।रेल पर रूबी में, मैं "वें" प्रत्यय के साथ दिनांक कैसे बना सकता हूं, जैसा कि "सूर्य अक्टूबर 5" है?

उदाहरण के लिए, जिस दिन यह सवाल पूछा गया था, वह "अक्टूबर 2 अक्टूबर" प्रदर्शित करेगा।

मैं रूबी 1.8.7, और Time.strftime का उपयोग कर रहा हूं, ऐसा नहीं लगता है। यदि कोई मौजूद है तो मैं एक मानक पुस्तकालय पसंद करूंगा।

+2

आप अपने प्रश्न या शीर्षक में "प्रत्यय" शब्द का उपयोग अन्य लोगों के लिए ढूंढना आसान बनाने के लिए करना चाहते हैं। मुझे यकीन नहीं है कि तिथियों के बारे में बात करते समय इसके लिए एक और शब्द है या नहीं। –

+0

उत्कृष्ट सवाल। मैं केवल कुछ दिन पहले ही यही सोच रहा था - बहुत उपयोगी। – RichH

उत्तर

254

'active_support' से ordinalize विधि का उपयोग करें।

>> time = Time.new 
=> Fri Oct 03 01:24:48 +0100 2008 
>> time.strftime("%a %b #{time.day.ordinalize}") 
=> "Fri Oct 3rd" 

ध्यान दें, यदि आप रूबी 2.0 के साथ आईआरबी उपयोग कर रहे हैं, तो आपको पहले चलाना चाहिए:

require 'active_support/core_ext/integer/inflections' 
+13

बस ध्यान दें कि यह मानक पुस्तकालय में नहीं है। –

90

आप संख्याओं पर सक्रिय_support की औपचारिक सहायक विधि का उपयोग कर सकते हैं।

>> 3.ordinalize 
=> "3rd" 
>> 2.ordinalize 
=> "2nd" 
>> 1.ordinalize 
=> "1st" 
9
>> require 'activesupport' 
=> [] 
>> t = Time.now 
=> Thu Oct 02 17:28:37 -0700 2008 
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}" 
=> "Thu Oct 2nd" 
5

मैं बार्तोज़ का जवाब चाहते हैं, लेकिन हे, के बाद से इस रेल के बारे में हम बात कर रहे हैं है चलो इसे कुटिल में एक कदम उठाओ। (संपादित करें: हालांकि मैं सिर्फ निम्न विधि monkeypatch जा रहा था, बदल जाता है एक क्लीनर तरीका है बाहर।)

DateTime उदाहरणों एक to_formatted_s विधि ActiveSupport द्वारा आपूर्ति की है, जो कि प्रतीक है, तो एक पैरामीटर के रूप में एक भी प्रतीक लेता है और, है एक वैध पूर्वनिर्धारित प्रारूप के रूप में पहचाना जाता है, उपयुक्त स्वरूपण के साथ एक स्ट्रिंग देता है।

उन प्रतीकों को Time::DATE_FORMATS द्वारा परिभाषित किया गया है, जो कि मानक स्वरूपण फ़ंक्शन ... या procs के लिए तारों के प्रतीक हैं। Bwahaha।

d = DateTime.now #Examples were executed on October 3rd 2008 
Time::DATE_FORMATS[:weekday_month_ordinal] = 
    lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") } 
d.to_formatted_s :weekday_month_ordinal #Fri Oct 3rd 

लेकिन हे, अगर आप monkeypatch करने का अवसर का विरोध नहीं कर सकते हैं, तो आप हमेशा एक क्लीनर इंटरफेस है कि दे सकता है:

class DateTime 

    Time::DATE_FORMATS[:weekday_month_ordinal] = 
     lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") } 

    def to_my_special_s 
    to_formatted_s :weekday_month_ordinal 
    end 
end 

DateTime.now.to_my_special_s #Fri Oct 3rd 
26

पैट्रिक मैकेंज़ी के जवाब ले रहा है बस थोड़ा आगे, आप एक बना सकते हैं अपने config/initializers निर्देशिका में नई फ़ाइल date_format.rb कहा जाता है (या जो भी आप चाहते हैं) और उस में यह डाल: यदि आप एक फ़ॉर्मेट कर सकते हैं आपके विचार कोड में फिर

Time::DATE_FORMATS.merge!(
    my_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") } 
) 

एनई डेट बस इसे अपना नया दिनांक प्रारूप सौंपकर:

My Date: <%= h some_date.to_s(:my_date) %> 

यह आसान है, यह काम करता है, और इसे बनाना आसान है। अपने प्रत्येक अलग-अलग दिनांक स्वरूपों के लिए date_format.rb फ़ाइल में बस अधिक प्रारूप पंक्तियां जोड़ें। यहां एक और अधिक fleshed उदाहरण है।

Time::DATE_FORMATS.merge!(
    datetime_military: '%Y-%m-%d %H:%M', 
    datetime:   '%Y-%m-%d %I:%M%P', 
    time:    '%I:%M%P', 
    time_military:  '%H:%M%P', 
    datetime_short: '%m/%d %I:%M', 
    due_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") } 
) 
+7

अच्छा जवाब। रेल 3 के लिए, ActiveSupport काफी बदल गया है, इसलिए निम्न समकक्ष है: 'समय :: DATE_FORMATS.merge! (: My_date => lambda {| time | time.strftime ("% a,% b # {ActiveSupport: : Inflector.ordinalize (समय।दिन)} ")})' – Sidane

+1

@ सिडेन को प्रतिबिंबित करने के लिए अपडेट किया गया। – Jonah

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