我试图得到一个日期范围的十进制月数。例子:
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
我已经创建了以下代码,它返回正确的结果,但感觉不像ruby方式:
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)
最佳答案
一个更好的方法是
离开的天数/离开的天数
结束的天数/结束的天数
从到到(从,到不包括)之间的月数
这样你就不用迭代了