在Ruby中生成一个没有时间的随机日期

时间:2013-12-26 10:52:40

标签: ruby-on-rails ruby date datetime

我的用户表上有一个生成日期列,需要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和编程的新手,所以任何帮助都会非常有用!

3 个答案:

答案 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