我的用户表上有一个生成日期列,需要DATE
。由于此数据类型显示为YYYY-MM-DD
,我假设在向数据库输入日期时,它必须具有格式,例如:2013-12-26
。
我已经在StackOverflow上看到了用于在Ruby中创建随机DateTime的方法,例如here。但是,经过多次搜索后,我找不到一种方法来生成一个没有时间的随机日期,例如在过去的100年中,并且已经为DATE
数据类型正确格式化了。在Rails中,没有时间生成随机日期的最佳方法是什么?
这似乎有效:
def rand_date(days) date = Date.today-rand(days) date.to_s(:db) end
但是Rails还有更优雅的解决方案吗?我是Rails和编程的新手,所以任何帮助都会非常有用!
答案 0 :(得分:3)
你的方法是正确的。如果您正在使用Rails,那么有一些微不足道的改进,例如
def rand_date(days)
rand(days).days.ago(Date.today)
end
大部分相当于
def rand_date(days)
rand(days).days.ago.to_date
end
第二个版本效率较低,因为它会在内部转换期间创建更多日期/时间对象。
如果您需要将日期格式化为字符串,请应用to_s(:db)
。
另一种方法要求您构建一个将rand
的结果传递给Date.new
的日期。
答案 1 :(得分:2)
这是核心ruby
:
1 #!usr/bin/ruby
2
3 require 'date'.
4
5 10.times do |t|
6 random_year = Random.new.rand(2000..2014) # custom range for years
7 random_month =Random.new.rand(1..12)
8 random_day = Random.new.rand(1..30)
9 puts "#{Date.new(random_year,random_month,random_day)}"
10 end
2014-11-29
2010-10-20
2006-02-23
2009-09-17
2006-01-14
2009-01-06
2002-07-06
2005-11-05
2013-06-20
2005-12-02
答案 2 :(得分:1)
以下是填充客户数据库时用于生成随机出生日期的内容。它适用于几天,在本例中,使用Date#jd
方法在1967-01-09和1993-01-12之间提供随机日期:
Date.jd(2439500 + rand(9500))
您可以通过设置基数(在本例中为2439500,即1967-01-09)和随机数来调整生成的日期,以增加或减少生成日期的范围。
示例:
irb(main):043:0> 10.times { puts Date.jd(2439500 + rand(9500)) }
1973-06-07
1973-11-09
1983-07-27
1990-11-03
1967-06-18
1967-06-20
1970-07-28
1990-05-13
1986-11-26
1989-02-15