मैं रेल्स डेटाइम ऑब्जेक्ट्स पर दो रूबी है। उनके बीच महीनों की संख्या का पता कैसे लगाएं? (ध्यान में रखते हुए वे अलग-अलग वर्षों के हो सकते हैं)
मैं रेल्स डेटाइम ऑब्जेक्ट्स पर दो रूबी है। उनके बीच महीनों की संख्या का पता कैसे लगाएं? (ध्यान में रखते हुए वे अलग-अलग वर्षों के हो सकते हैं)
जवाबों:
(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 दिनों में सेकंड की संख्या है और एक महीने में औसत सेकंड नहीं है। डाउनवोटिंग ताकि दूसरों को बग-मुक्त रहें।
आप इस प्रश्न को फिर से लिख सकते हैं कि "तारीखों के महीनों की शुरुआत के बीच कितने 1 दिन हैं", और फिर कार्यात्मक-शैली डेटा परिवर्तनों का उपयोग करें:
(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