Ruby on rails 在Rails中创建随机日期时间的最佳方法

Ruby on rails 在Rails中创建随机日期时间的最佳方法,ruby-on-rails,Ruby On Rails,在Ruby/Rails中生成随机日期时间的最佳方法是什么?正在尝试创建一个好的seeds.rb文件。这样使用它: Foo.create(name: Faker::Lorem.words, description: Faker::Lorem.sentence, start_date: Random.date) 我自己并没有尝试过这个方法,但你们可以在两个日期之间创建一个随机的整数,使用从新纪元开始的秒数。例如,获取上周的随机日期 end = Time.now start = (end - 1.

在Ruby/Rails中生成随机日期时间的最佳方法是什么?正在尝试创建一个好的seeds.rb文件。这样使用它:

 Foo.create(name: Faker::Lorem.words, description: Faker::Lorem.sentence, start_date: Random.date)

我自己并没有尝试过这个方法,但你们可以在两个日期之间创建一个随机的整数,使用从新纪元开始的秒数。例如,获取上周的随机日期

end = Time.now
start = (end - 1.week).to_i
random_date = Time.at(rand(end.to_i - start)) + start

当然,你最终得到的是一个时间对象而不是一个日期时间对象,但我相信你可以从这里转换过来。

这里有一组方法可以生成一个范围内的随机整数、数量、时间/日期时间

def rand_int(from, to)
  rand_in_range(from, to).to_i
end

def rand_price(from, to)
  rand_in_range(from, to).round(2)
end

def rand_time(from, to=Time.now)
  Time.at(rand_in_range(from.to_f, to.to_f))
end

def rand_in_range(from, to)
  rand * (to - from) + from
end
现在您可以拨打以下电话

rand_int(60, 75)
# => 61

rand_price(10, 100)
# => 43.84

rand_time(2.days.ago)
# => Mon Mar 08 21:11:56 -0800 2010

我更喜欢使用
(1..500)。来创建过去10年的日期:

rand(10.years).ago
您还可以在将来获得日期:

rand(10.years).from_now
更新–Rails 4.1+ Rails 4.1不赞成在调用
.ago
时从Numeric=>seconds进行隐式转换,上面的代码依赖于此。有关此操作的更多信息,请参阅。为了避免Rails 4.1中出现弃用警告,您需要显式转换为秒,如下所示:

rand(10.years).seconds.ago

正如我在另一个问题中已经提到的那样,我认为下面的代码片段对于参数和要返回的值的数据类型更为一致

无论如何,这使用了rand()方法的内部逻辑,即在一个范围内的随机日期或随机时间。也许有人有一种更有效的方法,可以将随机日期方法的默认参数设置为(Time.now.to_date),因此它不需要这种类型转换

def random_time from = Time.at(0.0), to = Time.now
  rand(from..to)
end

# works quite similar to date :)
def random_date from = Date.new(1970), to = Time.now.to_date
  rand(from..to)
end

编辑:在ruby v1.9.3之前,此代码不起作用。以下是如何创建本月的日期:

day = 1.times.map{ 0+Random.rand(30) }.join.to_i  
rand(day.days).ago
其他方式:

(10..20).to_a.sample.years.ago

我的“ish”gem提供了一种很好的处理方法:

# plus/minus 5 min of input date
Time.now.ish
# override that time range like this
Time.now.ish(:offset => 1.year)
另一种方法是使用


你用的是假货;为什么不使用提供的方法之一

#日期之间的随机日期
#关键字参数:从、到
Faker::Date.介于(从:2天前到:Date.今天)#=>“2014年9月24日星期三”
#日期之间的随机日期,特定日期除外
#关键字参数:from、to、excepted
Faker::Date.between除了(从:1年前到:1年现在,除了:Date.today)#=>“2014年9月24日星期三”
#未来的随机日期(最多N天)
#关键字参数:天
Faker::Date.forward(日期:23)#=>“2014年10月3日星期五”
#过去的随机日期(最多N天)
#关键字参数:天
Faker::Date.backward(日期:14)#=>“2014年9月19日星期五”
#随机生日(最大年龄在18到65岁之间)
#关键词参数:最小年龄、最大年龄
伪造者:日期.生日(最小年龄:18岁,最大年龄:65岁)#=>“1986年3月28日”
#本年随机日期
伪造者::Date.in_Date_period#=>#
#2018年和第2个月范围内的随机日期
#关键词参数:年、月
伪造者:日期。在#日期(年:2018年,月:2#)=>#
#本年度和第2个月范围的随机日期
#关键字参数:月份
伪造者::日期。在_日期_期间(月:2)#=>#
当前伪造版本:2.11.0这是我使用的:

# get random DateTime in last 3 weeks
DateTime.now - (rand * 21)

您可以将时间范围传递到
rand

rand(10.weeks.ago..1.day.ago)
输出示例:

=> Fri, 10 Jan 2020 10:28:52 WIB +07:00

此代码将抛出语法错误(Range类没有rand方法),并且,您可以使用
(-200..200).to_a.rand.days.ago
也包括将来的日期。对于我的种子数据非常有用我认为这个没有显式类型转换的代码看起来更好:
rand(-200..200).days.ago
Marc的solution()更好。此解决方案在每次需要创建随机日期时都会创建一个500项数组。您可以使用(1..500).to_a.sample.days.ago。如果您在过去或将来需要,您可以使用
rand(-5.years..5.years).ago
我的答案使用Rails在调用
.ago
时从数值=>秒的隐式转换。这在Rails 4.1中已经被弃用了:我想我会将我的答案编辑为:
rand(10.years).seconds.ago
为了解决这个弃用,你也可以使用
rand(10.years.ago
@MichaelSaffitz,它可能不会像你期望的那样工作——它会给出一个日期,或者是1年前,或者是2年前,或者是3年前,等等。使用Rails 4.1信息更新。getting NoMethodError:Ruby 2.2中main:Object的未定义方法“rand\u in\u range”
rand(10.weeks.ago..1.day.ago)
=> Fri, 10 Jan 2020 10:28:52 WIB +07:00