আমার কাছে দু'জন রুবি রেলস ডেটটাইম অবজেক্টে রয়েছে। তাদের মধ্যে মাসের সংখ্যাটি কীভাবে সন্ধান করবেন? (তারা বিভিন্ন বছরের অন্তর্গত হতে পারে তা মাথায় রেখে)
আমার কাছে দু'জন রুবি রেলস ডেটটাইম অবজেক্টে রয়েছে। তাদের মধ্যে মাসের সংখ্যাটি কীভাবে সন্ধান করবেন? (তারা বিভিন্ন বছরের অন্তর্গত হতে পারে তা মাথায় রেখে)
উত্তর:
(date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)
http://www.ruby-forum.com/topic/72120 এ আরও তথ্য
(12 * (date2.year - date1.year) + date2.month - date1.month).abs if date1 && date2
আরও সঠিক উত্তরটি দূরত্বের দিনগুলি বিবেচনা করবে।
উদাহরণস্বরূপ, আপনি যদি বিবেচনা করেন যে মাসের দূরত্বটি তার থেকে 28/4/2000
এবং 1/5/2000
এর 0
চেয়ে বেশি হয় 1
তবে আপনি ব্যবহার করতে পারেন:
(date2.year - date1.year) * 12 + date2.month - date1.month - (date2.day >= date1.day ? 0 : 1)
চেষ্টা করুন
((date2.to_time - date1.to_time)/1.month.second).to_i
irb>Time.at("2014-10-01".to_time - "2014-12-01".to_time).month => 10
(আমি ফর্ম্যাটিং ছেড়ে দিয়েছি ... এটি অনুমান করতে পারছি না)
Date.new(2014, 10, 31), Date.new(1997, 4, 30)
আমি 210 মাসের পরিবর্তে 213 পেয়েছি। এর কারণ 1.month.seconds
হ'ল 30 দিনের মধ্যে সেকেন্ডের সংখ্যা এবং এক মাসে গড় সেকেন্ড নয়। ডাউনভোটিং যাতে অন্যরা বাগ-মুক্ত থাকে।
আপনি "তারিখের মাসের শুরুতে কত প্রথম দিন রয়েছে" হিসাবে এই প্রশ্নটি পুনরায় লিখে দিতে পারেন এবং তারপরে ক্রিয়ামূলক-স্টাইলের ডেটা ট্রান্সফর্মেশনগুলি ব্যবহার করতে পারেন:
(date1.beginning_of_month...date2.beginning_of_month).select { |date| date.day == 1 }.size
ধরে নেওয়া উভয় তারিখ:
((date2 - date1).to_f / 365 * 12).round
সাধারণ।
((date2 - date1).to_f / 60 / 60 / 24 / 365 * 12).round
start_date = Date.today
end_date = Date.today+90
months = (end_date.month+end_date.year*12) - (start_date.month+start_date.year*12)
//months = 3
আপনি যে ফলাফলটি এক মাসের ভগ্নাংশ অন্তর্ভুক্ত করতে চান তা যদি খুঁজে পেয়েছি (ইতিমধ্যে এখানে পোস্ট করা একটি সমাধান তৈরি করেছেন) এর জন্য অন্য একটি সমাধান উদাহরণস্বরূপ দূরত্ব 1.2 months
।
((date2.to_time - date1.to_time)/1.month.second).round(1) #Tenth of a month Ex: 1.2
((date2.to_time - date1.to_time)/1.month.second).round(2) #Hundreth, ex: 1.23 months
etc...
def difference_in_months(date1, date2)
month_count = (date2.year == date1.year) ? (date2.month - date1.month) : (12 - date1.month + date2.month)
month_count = (date2.year == date1.year) ? (month_count + 1) : (((date2.year - date1.year - 1 ) * 12) + (month_count + 1))
month_count
end
আমার দুটি তারিখের মধ্যে মাসের সঠিক সংখ্যা (দশমিক সহ) প্রয়োজন এবং এর জন্য নিম্নলিখিত পদ্ধতিটি লিখেছি।
def months_difference(period_start, period_end)
period_end = period_end + 1.day
months = (period_end.year - period_start.year) * 12 + period_end.month - period_start.month - (period_end.day >= period_start.day ? 0 : 1)
remains = period_end - (period_start + months.month)
(months + remains/period_end.end_of_month.day).to_f.round(2)
end
যদি তুলনা করা যাক 26 শে সেপ্টেম্বর থেকে 26 শে সেপ্টেম্বর পর্যন্ত (একই দিন) আমি এটিকে 1 দিন হিসাবে গণনা করি। আপনার যদি প্রয়োজন না হয় তবে আপনি পদ্ধতিটিতে প্রথম লাইনটি সরিয়ে ফেলতে পারেন:period_end = period_end + 1.day
এটি নিম্নলিখিত চশমা পাস:
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 31))).to eq 1.0
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 30))).to eq 0.97
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 10, 31))).to eq 3.0
# Overlapping february (28 days) still counts Feb as a full month
expect(months_difference(Date.new(2017, 1, 1), Date.new(2017, 3, 31))).to eq 3.0
expect(months_difference(Date.new(2017, 2, 10), Date.new(2017, 3, 9))).to eq 1.0
# Leap year
expect(months_difference(Date.new(2016, 2, 1), Date.new(2016, 2, 29))).to eq 1.0
এখানে অন্য পদ্ধতি। এটি দুটি তারিখের মধ্যে পুরো মাসের সংখ্যা গণনা করতে সহায়তা করবে
def months_difference(date_time_start, date_time_end)
curr_months = 0
while (date_time_start + curr_months.months) < date_time_end
curr_months += 1
end
curr_months -= 1 if (date_time_start + curr_months.months) > date_time_end
curr_months.negative? ? 0 : curr_months
end
যে কোনও ক্ষেত্রে সমাধান
(date1..date2).map { |date| date.strftime('%m.%Y') }.uniq.size