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 版本,因为我将从模型字段中提取日期时间。
我认为你有一个逐一的问题。如果您有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)
在任何情况下,您都可以使用map和each_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_f或to_i那个。
| 归档时间: |
|
| 查看次数: |
1127 次 |
| 最近记录: |