Подтвердить что ты не робот

Как создать случайную дату в Ruby?

У меня есть модель в моем приложении 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

Я хотел бы предварительно заполнить мою базу данных случайными значениями даты.

Каков самый простой способ генерации случайной даты?

4b9b3361

Ответ 1

Здесь небольшое расширение ответа Криса с параметрами 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 

Ответ 2

Попробуйте следующее:

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

Ответ 3

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)

Ответ 4

Держать просто..

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

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

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

Ответ 5

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

Ответ 6

Здесь также больше (в моем оппионе) улучшена версия кода Младена. К счастью, функция Ruby rand() также может обрабатывать Time-Objects. Что касается 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

Ответ 7

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

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

Прекрасно подходит для моего lorem ipsum. Очевидно, минуты и секунды будут исправлены.

Ответ 8

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

DateTime.now - (rand * 21)

Ответ 9

Младенский ответ немного сложно понять из одного взгляда. Здесь я беру на себя это.

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

Ответ 10

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

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

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

Ответ 11

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

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