web-dev-qa-db-fra.com

Comment générer une date au hasard dans Ruby?

J'ai un modèle dans mon application Rails 3 qui a un champ date:

class CreateJobs < ActiveRecord::Migration
  def self.up
    create_table :jobs do |t|
      t.date "job_date", :null => false
      ...
      t.timestamps
    end
  end
  ...
end

Je voudrais pré-remplir ma base de données avec des valeurs de date aléatoires.

Quel est le moyen le plus simple de générer une date aléatoire?

30
Misha Moroshko

Voici une légère extension de la réponse de Chris, avec les paramètres optionnels from et 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 
58
Mladen Jablanović

Essaye ça:

Time.at(Rand * Time.now.to_i)
41
Chris Heald
Rand(Date.civil(1990, 1, 1)..Date.civil(2050, 12, 31))

ma méthode préférée

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

puis utiliser comme

random_date = random_date_in_year(2000..2020)
13
idrinkpabst

Rester simple ..

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

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

PS En augmentant/diminuant le paramètre '10000', change la plage de dates disponibles.

12
iGallina

Pour les versions récentes de Ruby/Rails, vous pouvez utiliser Rand sur une plage 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)

N'hésitez pas à ajouter to_date, to_datetime, etc. pour convertir votre classe préférée

Testé sur Rails 5.0.3 et Ruby 2.3.3, mais apparemment disponible sur Ruby 1.9+ et Rails 3+

3
Cyril Duchon-Doris

Voici également une version améliorée (à mon avis) du fragment de code de Mladen. Heureusement, la fonction Rand () de Ruby peut également gérer les objets de temps. En ce qui concerne l'objet Date est défini lors de l'inclusion de Rails, la méthode Rand () est écrasée afin de pouvoir également gérer les objets Date. par exemple.:

# 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

Edit: ce code ne fonctionnera pas avant Ruby v1.9.3

3
loybert

Voici mon seul article pour générer une date aléatoire au cours des 30 derniers jours (par exemple): 

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

Fonctionne très bien pour mon lorem ipsum. Évidemment, les minutes et les secondes seraient corrigées.

2
Matt

Ce qui suit renvoie une date-heure aléatoire au cours des 3 dernières semaines en Ruby (sans Rails).

DateTime.now - (Rand * 21)

2
Merovex

Puisque vous utilisez Rails, vous pouvez installer la gemme faker et utiliser le module Faker :: Date .

par exemple. Ce qui suit génère une date aléatoire en 2018:

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

0
Yuxuan Chen

La réponse de Mladen est un peu difficile à comprendre d'un simple regard. Voici mon point de vue sur ceci.

def time_Rand from=0, to= Time.now
  Time.at(Rand(from.to_i..to.to_i))
end
0
dhaliman