获取日期范围的十进制月数

时间:2011-08-27 16:22:36

标签: ruby date diff

我尝试获取日期范围的十进制月数。例如:

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)

1 个答案:

答案 0 :(得分:1)

更好的方法是总结

  • 开始的天数/天数
  • 完成日期/天数
  • 从和之间(从,除去)之间的月数

这样你就不会有迭代了