如何在Ruby中生成随机日期?

时间:2011-02-04 03:11:21

标签: ruby-on-rails ruby ruby-on-rails-3 date random

我的Rails 3应用程序中有一个模型,其中包含date字段:

class CreateJobs < ActiveRecord::Migration
  def self.up
    create_table :jobs do |t|
      t.date "job_date", :null => false
      ...
      t.timestamps
    end
  end
  ...
end

我想用随机日期值预填充我的数据库。

生成随机日期的最简单方法是什么?

11 个答案:

答案 0 :(得分:58)

以下是对Chris回答的轻微扩展,其中包含可选的fromto参数:

def time_rand from = 0.0, to = Time.now
  Time.at(from + rand * (to.to_f - from.to_f))
end

> time_rand
 => 1977-11-02 04:42:02 0100 
> time_rand Time.local(2010, 1, 1)
 => 2010-07-17 00:22:42 0200 
> time_rand Time.local(2010, 1, 1), Time.local(2010, 7, 1)
 => 2010-06-28 06:44:27 0200 

答案 1 :(得分:41)

试试这个:

Time.at(rand * Time.now.to_i)

答案 2 :(得分:14)

rand(Date.civil(1990, 1, 1)..Date.civil(2050, 12, 31))

我最喜欢的方法

def random_date_in_year(year)
  return rand(Date.civil(year.min, 1, 1)..Date.civil(year.max, 12, 31)) if year.kind_of?(Range)
  rand(Date.civil(year, 1, 1)..Date.civil(year, 12, 31))
end

然后使用

random_date = random_date_in_year(2000..2020)

答案 3 :(得分:13)

保持简单......

Date.today-rand(10000) #for previous dates

Date.today+rand(10000) #for future dates

PS。增加/减少'10000'参数,改变可用日期范围。

答案 4 :(得分:4)

对于最新版本的Ruby / Rails,您可以在rand范围内使用Time❤️!!

min_date = Time.now - 8.years
max_date = Time.now - 1.year
rand(min_date..max_date)
# => "2009-12-21T15:15:17.162+01:00" (Time)

随意添加to_dateto_datetime等,以转换为您喜欢的课程

在Rails 5.0.3和Ruby 2.3.3上测试过,但显然可以从Ruby 1.9+和Rails 3 +获得

答案 5 :(得分:3)

这里还有更多(在我看来)Mladen代码片段的改进版本。幸运的是,Ruby的 rand()函数也可以处理时间对象。关于Date-Object是在包含Rails时定义的,rand()方法被覆盖,因此它也可以处理Date-Objects。 e.g:

# works even with basic ruby
def random_time from = Time.at(0.0), to = Time.now
  rand(from..to)
end

# works only with rails. syntax is quite similar to time method above :)
def random_date from = Date.new(1970), to = Time.now.to_date
  rand(from..to)
end

编辑:此代码在ruby v1.9.3

之前不起作用

答案 6 :(得分:2)

这是我在过去30天内生成随机日期的一个班轮(例如):

<portlet:renderURL var="varA">
    <portlet:param name="mvcPath" value="/a.jsp"/>
</portlet:renderURL>

<portlet:renderURL var="varB">
    <portlet:param name="mvcPath" value="/b.jsp"/>
</portlet:renderURL>

<a href="<%=varA %>">Link to A</a>
<a href="<%=varB %>">Link to B</a>

非常适合我的lpsm ipsum。显然会修复几分钟和几秒钟。

答案 7 :(得分:2)

以下内容在Ruby(sans Rails)中返回过去3周内的随机日期时间。

DateTime.now - (rand * 21)

答案 8 :(得分:1)

对我来说最漂亮的解决方案是:

rand(1.year.ago..50.weeks.from_now).to_date

答案 9 :(得分:0)

只要一眼就能看出Mladen的答案有点难以理解。这是我对此的看法。

def time_rand from=0, to= Time.now
  Time.at(rand(from.to_i..to.to_i))
end

答案 10 :(得分:0)

由于使用的是Rails,因此可以安装faker gem并使用Faker::Date模块。

例如以下代码会在2018年生成一个随机日期:

Faker::Date.between(Date.parse('01/01/2018'), Date.parse('31/12/2018'))