我的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
我想用随机日期值预填充我的数据库。
生成随机日期的最简单方法是什么?
答案 0 :(得分:58)
以下是对Chris回答的轻微扩展,其中包含可选的from
和to
参数:
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_date
,to_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'))