我正在编写一个Rails应用程序,允许用户输入他们完成任务的时间。
我将时间存储为Time
个对象,我需要一种方法来获取用户完成任务的平均时间。
我该如何做到这一点?
我尝试使用МалъСкрылевъ的答案
@deliveries = Delivery.all
times = Array.new
@deliveries.each do |d|
times.push(d.time)
end
puts times # gives me [2000-01-01 06:15:00 UTC, 2000-01-01 07:18:00 UTC]
unless times.empty?
@avg = Time.at(times.map(&:to_i).reduce(:+) / times.size)
end
puts @avg #gives me 1999-12-31 23:46:30 -0700
答案 0 :(得分:2)
您可以在表示为Time
的{{1}}对象上使用数学方程和语句:
Integer
对于特定时间数组也是如此:
首先:
times = [ Time.now, Time.now ]
Time.at(times.map(&:to_i).reduce(:+) / times.size)
第二
times = ["2000-01-01 08:13:00 UTC", "2000-01-01 18:14:00 UTC", "2000-01-01 16:55:00 UTC", "2000-01-01 23:53:00 UTC", "2000-01-01 00:56:00 UTC", "2000-01-01 02:57:00 UTC", "2000-01-01 00:01:00 UTC"].map {|t| Time.parse(t) }
Time.at(times.map(&:to_i).reduce(:+) / times.size)
# => 2000-01-01 13:09:51 +0300
答案 1 :(得分:2)
您可以按时间对象计算平均值(它们可以在不同的日期)。这样的事情应该有效。
deliveries_at = @deliveries.map { |d| d.time.hour * 3600 + d.time.min * 60 + t.sec }
avg = deliveries_at.inject(:+) / deliveries_at.count
avg_hour = avg / 3600
avg_minute = (avg % 3600) / 60
avg_second = avg % 60
第一行从每次交付的每天开始收集秒数。第二行计算平均值(以秒为单位),最后三行计算为小时/分钟/秒。