ruby - 获取日期范围的小数月数

标签 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)

最佳答案

更好的方法是求和

  • 剩余天数/剩余天数
  • 完成的天数/完成的天数
  • 从和到(从,到排除)之间的月数

这样你就不需要迭代了

关于ruby - 获取日期范围的小数月数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215772/

相关文章:

ruby-on-rails - 我可以在 ActiveRecord 中序列化什么对象?

ruby - 如何在使用 Ruby 的 OpenUri 下载之前获取 HTTP header

git - 如何让我的 git 集成 Kaleidoscope 显示所有即将提交的文件?

git - 如何使 git diff 将文件视为二进制_仅有时_

ruby - 我如何在 Ruby/Rails 之外的 Haml 中嵌入 CoffeeScript?

ruby - 如何在 ruby​​ 中对字母数字数组进行排序

java - 无法转换 10 月 7 日星期二 :00:00 EEST 2014 to Date object

java - 想通过java将日期转换为美国格式

java - 为什么 Java 中字符串比较结果不打印 0,1 或 -1?

diff - 如何通过输出获取差异文件名