计算Ruby中日期时间之间的平均天数

use*_*029 4 ruby ruby-on-rails ruby-on-rails-4

我想在 Ruby 中获取日期时间列表,然后计算它们之间的天数,然后平均这些日期。这样对吗?有没有更短的方法来做到这一点?

dates = ["2012-08-05 00:00:00 UTC", "2012-06-17 00:00:00 UTC", "2012-06-15 00:00:00 UTC", "2011-06-06 00:00:00 UTC"]

difference = Array.new

dates.each_with_index do |date, index|
    if index != 0
        difference << date.to_date - dates[index - 1].to_date
    end
end

avg = difference.inject{ |sum, el| sum + el }.to_f / arr.size
Run Code Online (Sandbox Code Playgroud)

然后会以天格式输出吗?

如果您愿意,您也可以给我一个 Rails 版本,因为我将从模型字段中提取日期时间。

mu *_*ort 5

我认为你有一个逐一的问题。如果您有n值,dates那么您将n-1在连续对之间存在差异,因此您avg应该:

avg = difference.inject{ |sum, el| sum + el }.to_f / (arr.size - 1)
Run Code Online (Sandbox Code Playgroud)

而你inject只是一种冗长的说法,inject(:+)所以你可以说:

avg = difference.inject(:+).to_f / (arr.size - 1)
Run Code Online (Sandbox Code Playgroud)

在任何情况下,您都可以使用mapeach_cons使它更好一点:

dates.map(&:to_date).each_cons(2).map { |d1, d2| d1 - d2 }.inject(:+) / (dates.length - 1)
Run Code Online (Sandbox Code Playgroud)

首先,我们可以一次性将所有内容转换为日期,map(&:to_date)而不是每次需要日期而不是字符串时都进行转换。然后each_cons(2)以连续对迭代数组(即[1,2,3,4]迭代为[[1,2], [2,3], [3,4]])。然后简单map地获取对之间的差异inject(:+)并将它们全部加起来。

以上将为您留下一个Rational但是如果您需要浮点或整数值,您可以to_fto_i那个。