रूबी ऑन रेल्स में, मैं "वें" प्रत्यय के साथ एक तारीख को कैसे प्रारूपित करूं, जैसा कि "सन अक्टूबर 5 वें" में है?


177

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

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

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


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

बहुत बढ़िया सवाल। मैं एक ही बात कुछ दिन पहले सोच रहा था - बहुत मददगार।
रिचएच

जवाबों:


278

Inal active_support ’से क्रमबद्ध विधि का उपयोग करें।

>> 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'

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

97

आप नंबरों पर active_support के सहायक हेल्पर विधि का उपयोग कर सकते हैं।

>> 3.ordinalize
=> "3rd"
>> 2.ordinalize
=> "2nd"
>> 1.ordinalize
=> "1st"

30

पैट्रिक मैकेंजी के उत्तर को थोड़ा और आगे ले जाते हुए, आप अपनी 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 फ़ाइल में अधिक प्रारूप रेखाएँ जोड़ें। यहाँ एक और अधिक उदाहरण है।

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 में थोड़ा बदलाव आया है, इसलिए निम्नलिखित समतुल्य है:Time::DATE_FORMATS.merge!(:my_date => lambda { |time| time.strftime("%a, %b #{ActiveSupport::Inflector.ordinalize(time.day)}") })
Sidane


6

मुझे बार्टोज़ का जवाब पसंद है, लेकिन हे, क्योंकि यह रेल है जिसके बारे में हम बात कर रहे हैं, चलो इसे कुटिलता में एक कदम बढ़ाएं। (संपादित करें: हालाँकि मैं निम्नलिखित विधि का उपयोग करने के लिए जा रहा था, फिर भी वहाँ एक क्लीनर रास्ता है।)

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

उन प्रतीकों को परिभाषित किया जाता है Time::DATE_FORMATS, जो कि मानक स्वरूपण फ़ंक्शन ... या प्रोक्स के लिए या तो तार के प्रतीकों का एक हैश है। 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

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

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

3

अपना खुद का %oप्रारूप बनाएं ।

प्रारंभकर्ता

config/initializers/srtftime.rb

module StrftimeOrdinal
  def self.included( base )
    base.class_eval do
      alias_method :old_strftime, :strftime
      def strftime( format )
        old_strftime format.gsub( "%o", day.ordinalize )
      end
    end
  end
end

[ Time, Date, DateTime ].each{ |c| c.send :include, StrftimeOrdinal }

प्रयोग

Time.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

आप इसे Dateऔर DateTimeसाथ ही उपयोग कर सकते हैं :

DateTime.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

Date.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

यकीन नहीं है कि अगर यह प्रलेखित है। मुझे इसका कोई रिकॉर्ड नहीं मिल रहा है, लेकिन हम इसे अपने कोड बेस में इस्तेमाल कर रहे हैं, इसलिए इसे कहीं न कहीं मिल गया होगा।
जोशुआ पिंटर

1
मैं 2.6.3 पर काम करने के लिए इसे प्राप्त करने में सक्षम नहीं हूं। शायद यह रूबी के एक पुराने संस्करण में था? या हो सकता है कि किसी बंदर Timeने आपके प्रोजेक्ट में समझौता किया हो?
16 अप्रेल को kcdragon

2
@kcdragon वाह, आप बिलकुल सही थे। कोडबेस को खोजा और पाया कि मेरे पुराने दोस्त चक बर्जरॉन ने लगभग 7 साल पहले इस इनिशियलाइज़र को जोड़ा था। भले ही, मुझे अभी भी यह बहुत उपयोगी लगता है, इसलिए मैंने इसका उत्तर कैसे लागू किया है जैसे कि हम इसे CNTRAL में रखते हैं।
जोशुआ पिंटर

2

हालाँकि, जोनाथन ट्रान ने कहा कि वह पहले महीने के संक्षिप्त दिन की तलाश कर रहा था और उसके बाद संक्षिप्त महीने के बाद, मुझे लगता है कि यह उन लोगों के लिए उपयोगी हो सकता है जो यह जानते हैं कि रेल को अधिक समर्थन प्राप्त है आमतौर पर उपयोग करने योग्य लंबा महीना, दिन के पूर्णांक, वर्ष के बाद, जैसा कि होता है June 1st, 2018

इसे आसानी से प्राप्त किया जा सकता है:

Time.current.to_date.to_s(:long_ordinal)
=> "January 26th, 2019"

या:

Date.current.to_s(:long_ordinal)
=> "January 26th, 2019"

यदि आप चाहें तो एक समय उदाहरण के लिए छड़ी कर सकते हैं:

Time.current.to_s(:long_ordinal)
=> "January 26th, 2019 04:21"

आप रीलों एपीआई डॉक्स में एक कस्टम बनाने के तरीके के बारे में अधिक प्रारूप और संदर्भ पा सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.