2014-01-29 171 views
4

我想在Ruby中獲取日期時間列表,然後計算它們之間之間的天數,然後計算這些日期的平均值。它是否正確?有沒有更簡單的方法來做到這一點?計算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 

然後,它會以天的格式輸出它嗎?

你可以給我一個Rails版本,如果你願意,我會從模型字段中提取日期時間。

+1

如果數組'日期'包含通用格式的實際日期,那麼你的問題會更好。可能三個就足夠了。例如:'日期= [「2013年11月21日」,「2013年12月22日」,「2014年1月20日」]'然後顯示那些日期的輸出。這也可以讓讀者測試他們可能希望提出的代碼。 –

+0

好的,謝謝。我添加了一些日期時間。 – user2270029

+0

你也可以使用Ruby的精彩'Time.parse()'函數!它通常可以計算出如何自動將字符串轉換爲「Time」對象。 – TrinitronX

回答

3

我認爲你必須關閉的情況-一個問題。如果您有datesn值,那麼你就必須連續對之間的差異n-1所以你avg應該是:

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

而且你inject只是說inject(:+)的長篇大論方式,所以你可以說:

avg = difference.inject(:+).to_f/(arr.size - 1) 

在任何情況下,你可以使用mapeach_cons使它更好一點:

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

首先,我們可以將所有內容都轉換爲日期,與map(&:to_date)一起傳遞,而不是每次我們需要日期而不是轉換字符串時進行轉換。然後each_cons(2)以連續對在陣列上迭代(即[1,2,3,4]迭代爲[[1,2], [2,3], [3,4]])。然後通過一個簡單的map來獲得這兩個對之間的差異,然後將它們全部添加到inject(:+)

上面的內容將爲您提供Rational,但您可以to_fto_i如果您需要浮點或整數值。

+0

這真是太棒了。 – Micah

0

約像什麼:

def room_expiry_date_in_days(room) 
a=room.expiry_date.strftime("%Y-%m-%d") 
b=room.created_at.strftime("%Y-%m-%d") 
a=Date.parse(a) 
b=Date.parse(b) 
days=(a-b).to_i 
return "#{pluralize(days, 'day',"days")} left" 
end 

,或者如果我理解正確,那麼總會有:

span_secs = Foo.maximum(:created_at) - Foo.minimum(:created_at) 
avg_secs = span_secs/(Foo.count - 1) 
avg_days = avg_secs/(24 * 60 * 60) 

參見:Calculating the average days between records in Rails

+0

這是否計算每個日期之間的天數然後平均那些?也許我錯過了一些東西。 – user2270029

1

我可能會在這裏下車,但我認爲這應該工作:

require 'date' 
dates.map!{|x| Date.parse(x)}.sort! 
p (dates.last - dates.first)/(dates.size - 1) #=> (142/1) 

,或者這是更漂亮?

first, last = dates.map!{ |x| Date.parse(x) }.minmax 
p (last - first)/(dates.size - 1) #=> (142/1) 
+0

不錯,乾淨,hiro。 –

+0

只要日期不在終點切換方向,例如,'%w [2012-08-05 2012-06-17 2012-06-15 2011-06-06 2011-06-20]'會是有問題的,因爲最後一個差異的符號變化會拋出隱式取消在你的最小/最大。 –