2
我嘗試獲取日期範圍的小數月數。例如:獲取日期範圍的小數月數
ruby-1.9.2-p0 > from = Date.new(2011, 7, 6)
=> Wed, 06 Jul 2011
ruby-1.9.2-p0 > to = Date.new(2011, 8, 31)
=> Wed, 31 Aug 2011
ruby-1.9.2-p0 > to - from
=> (56/1)
所以差異是56天。但我想,需要幾個月的量:1.83
我已經創建了下面的一段代碼,返回正確的結果,但感覺並不像紅寶石方式:
months = Hash.new
(from..to).each do |date|
unless months.key? date.beginning_of_month
months[date.beginning_of_month] = 1
else
months[date.beginning_of_month] += 1
end
end
multiplicator = 0.0
months.each do |month, days|
multiplicator += days.to_f/month.end_of_month.day
end
return multiplicator.floor_to(2)
要誠實:它看起來很醜並且效率很低。但我無法找出更簡單的方法。 你能幫我找到更好的解決方案嗎?
有關更多問題,請隨時問我。
非常感謝提前!
更新/解決方案:問題解決了與下面的代碼:
months = 0.0
months += ((date_to < date_from.end_of_month ? date_to : date_from.end_of_month) - date_from + 1)/Time.days_in_month(date_from.month)
unless date_to.month == date_from.month
months += (date_to - date_to.beginning_of_month + 1)/Time.days_in_month(date_to.month)
months += date_to.month - date_from.month - 1
end
return months.floor_to(2)
如何準確,你必須是?請注意,月份從28-31天不等。因此,月份的數量沒有意義上的可比性(2月份的1天計數超過8月的1天)。鑑於此,是不是簡單地將30或30.5除以合理的代理? – peakxu
這是一個計費應用程序。所以我儘量做到儘可能準確。事實上,這將是最實用的解決方案。謝謝你的提示。 – flooooo