2010-04-21 102 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)) 
相关问题