2011-08-27 73 views
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) 
+3

如何準確,你必須是?請注意,月份從28-31天不等。因此,月份的數量沒有意義上的可比性(2月份的1天計數超過8月的1天)。鑑於此,是不是簡單地將30或30.5除以合理的代理? – peakxu

+0

這是一個計費應用程序。所以我儘量做到儘可能準確。事實上,這將是最實用的解決方案。謝謝你的提示。 – flooooo

回答

1

一個更好的方式做將是

  • 號留在天的總和從/天數
  • 完成天數/天數
  • 數個月的往返之間(從,至除外)

這樣,你不會有重複做

+0

我決定走這個解決方案。謝謝! – flooooo