রুবেল অন রেলস-এ, "সান 5 ই অক্টোবর" এর মতো আমি "তম" প্রত্যয় দিয়ে কীভাবে একটি তারিখ বিন্যাস করব?


177

আমি ফর্ম্যাটে তারিখগুলি প্রদর্শন করতে চাই: সপ্তাহের সংক্ষিপ্ত দিন, সংক্ষিপ্ত মাস, মাসের দিন শূন্যের অগ্রণী ব্যতীত তবে "ম", "স্ট", "এনডি", বা "আরডি" প্রত্যয় সহ।

উদাহরণস্বরূপ, যেদিন এই প্রশ্ন জিজ্ঞাসা করা হয়েছিল সেদিন "থু অক্টোবর 2 শে" প্রদর্শিত হবে।

আমি রুবি ১.৮..7 ব্যবহার করছি এবং টাইম.স্ট্রিফটাইম কেবল এটি করছে বলে মনে হচ্ছে না। আমি যদি একটি স্ট্যান্ডার্ড লাইব্রেরি উপস্থিত থাকি তবে পছন্দ করি।


2
অন্য লোকের পক্ষে এটি সহজতর করার জন্য আপনি আপনার প্রশ্ন বা শিরোনামে "প্রত্যয়" শব্দটি ব্যবহার করতে চাইতে পারেন। তারিখ সম্পর্কে কথা বলার সময় আমি এর জন্য আর একটি শব্দ আছে কিনা তা নিশ্চিত নই।
হারলে হলক্বে 0

দুর্দান্ত প্রশ্ন। আমি কয়েক দিন আগে একই জিনিসটি ভাবছিলাম - খুব সহায়ক।
রিচ এইচ

উত্তর:


278

'অ্যাক্টিভ_সপোর্ট' থেকে অর্ডিনালাইজ পদ্ধতিটি ব্যবহার করুন।

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

দ্রষ্টব্য, আপনি যদি রুবি ২.০ দিয়ে আইআরবি ব্যবহার করে থাকেন তবে আপনাকে অবশ্যই প্রথমে চালনা করতে হবে:

require 'active_support/core_ext/integer/inflections'

15
শুধু লক্ষ করুন এটি স্ট্যান্ডার্ড লাইব্রেরিতে নেই।
ক্রিস লয়েড

97

আপনি সংখ্যাগুলিতে অ্যাক্টিভ_সপোর্টের অর্ডিনালাইজ সহায়ক পদ্ধতি ব্যবহার করতে পারেন।

>> 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) %>

এটি সহজ, এটি কাজ করে এবং এটি তৈরি করা সহজ। আপনার প্রতিটি পৃথক তারিখের ফর্ম্যাটের জন্য ডেট_ফরম্যাট.আরবি ফাইলে আরও ফর্ম্যাট লাইন যুক্ত করুন। এখানে আরও ঝলকানো উদাহরণ।

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 এর জন্য, অ্যাক্টিভসপোর্ট বেশ কিছুটা পরিবর্তিত হয়েছে, সুতরাং নিম্নলিখিতটি সমতুল্য:Time::DATE_FORMATS.merge!(:my_date => lambda { |time| time.strftime("%a, %b #{ActiveSupport::Inflector.ordinalize(time.day)}") })
সিডানে


6

বার্তোসজের উত্তরটি আমি পছন্দ করি তবে ওহে, যেহেতু এটি রইল আমরা যার বিষয়ে কথা বলছি, আসুন আমরা এটি কৃপণতার সাথে একধাপ এগিয়ে নিয়ে যাই। (সম্পাদনা করুন: যদিও আমি নীচের পদ্ধতিটিতে কেবল বানকিপ্যাচ করতে যাচ্ছিলাম, সেখানে আরও পরিষ্কার উপায় আছে)

DateTime দৃষ্টান্তগুলি ক to_formatted_s অ্যাক্টিভসপোর্ট দ্বারা সরবরাহিত পদ্ধতি রয়েছে যা প্যারামিটার হিসাবে একক প্রতীক নেয় এবং যদি সেই চিহ্নটি একটি বৈধ পূর্বনির্ধারিত ফর্ম্যাট হিসাবে স্বীকৃত হয় তবে উপযুক্ত বিন্যাসের সাথে একটি স্ট্রিং প্রদান করে।

এই চিহ্নগুলি দ্বারা সংজ্ঞায়িত করা হয় 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
আমি এটি ২.6.৩ এ কাজ করতে সক্ষম নই। এটি কি রুবির পুরানো সংস্করণে ছিল? বা হতে পারে কেউ Timeআপনার প্রকল্পে বাঁদর ?
কেসিড্রাগন

2
@ কেসিড্রাগন ওয়াও, আপনি একেবারে ঠিক বলেছেন। কোডবেস অনুসন্ধান করে দেখতে পেলেন যে আমার পুরানো বন্ধু চক বার্গারন প্রায় 7 বছর আগে এই আরম্ভকারীটি যুক্ত করেছিলেন added নির্বিশেষে, আমি এখনও এটি খুব দরকারী বলে মনে করি তাই এটি কীভাবে কার্যকর করা যায় তার উত্তরটি আপডেট করেছিলাম যেমন এটি সিএনটিআরএল-তে রয়েছে।
জোশুয়া পিন্টার

2

যদিও জোনাথন ট্রান বলেছিলেন যে তিনি প্রথমে সংক্ষিপ্ত মাসের পরে সপ্তাহের সংক্ষিপ্ত দিনের সন্ধান করছেন, আমি মনে করি যে এখানে যারা শেষ হয়েছে তাদের পক্ষে জেনে রাখা কার্যকর হবে যে রেলগুলি বাক্সের বাইরে বাকী সমর্থন রয়েছে for সাধারণত ব্যবহারযোগ্য দীর্ঘ মাস, নিয়মিত দিন পূর্ণসংখ্যার পরে বছরটি অনুসরণ করে 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"

আপনি কীভাবে রেল এপিআই ডক্সে একটি পছন্দসই তৈরি করবেন সে সম্পর্কে আরও ফর্ম্যাট এবং প্রসঙ্গ খুঁজে পেতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.