Лучший способ создать случайный DateTime в Rails - PullRequest
37 голосов
/ 09 марта 2010

Каков наилучший способ генерации случайного DateTime в Ruby / Rails? Попытка создать хороший файл seed.rb. Собираюсь использовать это так:

 Foo.create(name: Faker::Lorem.words, description: Faker::Lorem.sentence, start_date: Random.date)

Ответы [ 11 ]

122 голосов
/ 03 февраля 2011

Вот как создать дату за последние 10 лет:

rand(10.years).ago

Вы также можете получить дату в будущем:

rand(10.years).from_now

Обновление - Rails 4.1 +

В Rails 4.1 устарело неявное преобразование из Numeric => секунд при вызове .ago, от которого зависит приведенный выше код См. Rails PR # 12389 для получения дополнительной информации об этом. Чтобы избежать предупреждения об устаревании в Rails 4.1, вам нужно сделать явное преобразование в секунды, например так:

rand(10.years).seconds.ago
34 голосов
/ 09 марта 2010

Вот набор методов для генерации случайного целого числа, суммы, времени и даты в диапазоне.

def rand_int(from, to)
  rand_in_range(from, to).to_i
end

def rand_price(from, to)
  rand_in_range(from, to).round(2)
end

def rand_time(from, to=Time.now)
  Time.at(rand_in_range(from.to_f, to.to_f))
end

def rand_in_range(from, to)
  rand * (to - from) + from
end

Теперь вы можете совершать следующие звонки.

rand_int(60, 75)
# => 61

rand_price(10, 100)
# => 43.84

rand_time(2.days.ago)
# => Mon Mar 08 21:11:56 -0800 2010
17 голосов
/ 09 марта 2010

Я предпочитаю использовать (1..500).to_a.rand.days.ago

11 голосов
/ 23 октября 2014

Вы используете Faker; почему бы не использовать один из методов, предоставленных Faker::Date?

# Random date between dates
Faker::Date.between(2.days.ago, Date.today) #=> "Wed, 24 Sep 2014"

# Random date between dates except for certain date
Faker::Date.between_except(1.year.ago, 1.year.from_now, Date.today) #=> "Wed, 24 Sep 2014"

# Random date in the future (up to maximum of N days)
Faker::Date.forward(23) # => "Fri, 03 Oct 2014"

# Random date in the past (up to maximum of N days)
Faker::Date.backward(14) #=> "Fri, 19 Sep 2014"

# Random birthday date (maximum age between 18 and 65)
Faker::Date.birthday(18, 65) #=> "Mar, 28 Mar 1986"

текущая версия Faker: 1.9.1

2 голосов
/ 28 мая 2015

Вот что я использую:

# get random DateTime in last 3 weeks
DateTime.now - (rand * 21)
2 голосов
/ 15 ноября 2012

Вот как создать дату в этом месяце:

day = 1.times.map{ 0+Random.rand(30) }.join.to_i  
rand(day.days).ago
1 голос
/ 25 марта 2014

Другой подход с использованием DateTime's advance

def rand_date
  # return a random date within 100 days of today in both past and future directions.
  n = rand(-100..100)
  Date.today.advance(days: n)
end
1 голос
/ 25 февраля 2013

другой способ:

(10..20).to_a.sample.years.ago
0 голосов
/ 01 августа 2013

Мой гем 'ish' обеспечивает хороший способ обработки этого:

# plus/minus 5 min of input date
Time.now.ish
# override that time range like this
Time.now.ish(:offset => 1.year)

https://github.com/spilliton/ish

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

Как я уже упоминал в другом вопросе, я думаю, что следующий фрагмент кода является более подходящим в отношении типов данных параметров и возвращаемого значения. Stackoverflow: как сгенерировать случайную дату в Ruby?

В любом случае это использует внутреннюю логику метода rand () - случайную дату или случайное время в пределах диапазона. Может быть, у кого-то есть более эффективный способ установить параметр по умолчанию в (Time.now.to_date) метода random_date , поэтому он не нуждается в этом приведении типов.

def random_time from = Time.at(0.0), to = Time.now
  rand(from..to)
end

# works quite similar to date :)
def random_date from = Date.new(1970), to = Time.now.to_date
  rand(from..to)
end

Редактировать: этот код не будет работать до ruby ​​v1.9.3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...