【问题标题】:Average time of day? [closed]一天中的平均时间? [关闭]
【发布时间】:2014-04-21 05:25:29
【问题描述】:

我正在编写一个 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

【问题讨论】:

标签: ruby time average


【解决方案1】:

您可以在Time 表示为Integer 的对象上使用数学方程和语句:

times = [ Time.now, Time.now ]
Time.at(times.map(&:to_i).reduce(:+) / times.size)

示例

具体的时间数组也一样:

  1. 第一:

    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
    
  2. 第二:

    times = ['2000-01-01 06:15:00 UTC', '2000-01-01 07:18:00 UTC'].map {|t|Time.parse(t)}
    # => [2000-01-01 06:15:00 UTC, 2000-01-01 07:18:00 UTC] 
    Time.at(times.map(&:to_i).reduce(:+) / times.size)
    # => 2000-01-01 09:46:30 +0300 
    

【讨论】:

  • reduce(0, &:+) 可以简化为reduce(:+)
  • 这似乎每次都返回相同的时间,因为我一直在测试它
  • @Deekor 显示你的输入数组
  • @МалъСкрылевъ 你没有理解我的评论。
  • @sawa 不太明白 =)
【解决方案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

第一行为每次交付收集从当天开始的秒数。第二行计算平均值(以秒为单位),最后三行将其转换为小时/分钟/秒。

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2016-03-09
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多