2010-04-21 100 views

回答

56
Time.at((date2.to_f - date1.to_f)*rand + date1.to_f) 

您會得到兩個給定日期之間的時間對象。

+8

這是一個很好的解決方案。然而一記可能是爲了;您需要將您的日期轉換爲時間才能在其上調用'to_f'。 'Date'沒有'to_f'。 即'Date.today.to_time' – 2011-11-03 15:11:16

+0

+1簡單,重點,美觀。非常感謝。 – 2011-11-23 10:45:58

+0

我需要找到一種方法給你另一個+1 - 本週第二次我已經提到這個答案! – 2011-11-27 06:09:11

2

我不知道關於紅寶石,但你爲什麼不只是生成一個整數,並與時間戳一起使用?然後簡單地將時間戳轉換爲您想要的格式。

0

計算兩個日期之間的差異例如分鐘數,生成0到該數字之間的隨機數,並將該分鐘數添加到第一個日期。

4

使用time.to_i()(請參見類Time)將日期轉換爲整數,在這兩個值之間隨機化,然後使用Time.at()重新轉換爲時間和日期。

29

您應該能夠在一定範圍內生成隨機日期/時間。

now = Time.now 
a_day_ago = now - 60 * 60 * 24 

random_time = rand(a_day_ago..now) 

# with activesupport required 
up_to_a_year_ago = rand(1.year.ago..Time.now) 

您的輸入需要是Time類,或者轉換爲一個。

你也可以在時代做一段時間,然後使用Time#at

now = Time.now.to_i 
minute_ago = (Time.now - 60).to_i 
Time.at(rand(minute_ago..now)) 
+0

在我看來,這個解決方案比Evgeny目前接受的解決方案好得多。 – severin 2012-08-17 08:28:16

+1

雖然有一點小小的評論:'1.year.ago'只在* activesupport *加載時才起作用... – severin 2012-08-17 08:29:54

+0

好點@severin。我包含支持加載和不加載activesupport的代碼。還爲時代時間範圍添加了一個示例。 – 2012-08-17 17:09:43

4

使用rand()方法。

require 'time' 
t1 = Time.parse("2015-11-16 14:40:34") 
t2 = Time.parse("2015-11-20 16:20:23") 
puts rand(t1..t2) 
0
Time.at(rand(Time.parse('some date').to_i..Time.now.to_i)) 
相關問題