Как сгенерировать случайную дату в Ruby? - PullRequest
31 голосов
/ 04 февраля 2011

В моем приложении на 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 ]

58 голосов
/ 04 февраля 2011

Вот небольшое расширение ответа Криса с необязательными параметрами 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 
41 голосов
/ 04 февраля 2011

Попробуйте это:

Time.at(rand * Time.now.to_i)
14 голосов
/ 20 июля 2013
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)
13 голосов
/ 28 сентября 2012

Сохраняя простоту ..

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

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

PS. Увеличение / уменьшение параметра «10000» изменяет диапазон доступных дат.

4 голосов
/ 27 апреля 2017

Для последних версий 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 +

3 голосов
/ 20 августа 2012

Вот также более (по моему мнению) улучшенная версия фрагмента кода Младена.К счастью, функция rand () Руби также может обрабатывать объекты времени.Что касается Date-Object, который определяется при включении Rails, метод rand () перезаписывается, поэтому он может обрабатывать также Date-Objects.Например:

# 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

2 голосов
/ 04 марта 2018

Следующее возвращает случайную дату-время за последние 3 недели в Ruby (без Rails).

DateTime.now - (rand * 21)

2 голосов
/ 03 апреля 2016

Вот один мой лайнер для генерации случайной даты за последние 30 дней (например):

Time.now - (0..30).to_a.sample.days - (0..24).to_a.sample.hours

Прекрасно работает для моего Lorem Ipsum. Очевидно, минуты и секунды будут зафиксированы.

1 голос
/ 10 июля 2019

Самое красивое решение для меня:

rand(1.year.ago..50.weeks.from_now).to_date
0 голосов
/ 07 декабря 2018

Поскольку вы используете Rails, вы можете установить гем faker и использовать модуль Faker :: Date .

например. Следующее генерирует случайную дату в 2018 году:

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

...