2011-02-04 11 views
26

Ho un modello nella mia applicazione Rails 3, che ha un campo date:Come generare una data casuale in Ruby?

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

Vorrei precompilare il mio database con i valori di data casuale.

Qual è il modo più semplice per generare una data casuale?

+0

non puoi semplicemente fare Time.now? O hai davvero bisogno di usare date casuali? – corroded

+1

Voglio davvero avere valori casuali :) –

risposta

54

Ecco una leggera espansione sulla risposta di Chris', con opzionali from e to parametri:

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 
+0

Ottimo !! Grazie mille :) –

+3

Funziona. Basta chiedersi potrebbe essere semplificato con 'Time.at (rand * Time.now.to_f)'? –

+1

Continuo a chiedermi quando diventerà parte del nucleo rubino! Come 'rand (date1..date2)'! –

40

Prova questo:

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

Questo genererà una data casuale da epoca ad oggi – tothemario

+0

Breve e dolce, mi piace. – sevenseacat

+0

Grazie per questo! È breve e molto infallibile. – Ravenstine

3

Ecco anche un altro (a mio parere) versione migliorata di Mladen di code-snippet. Fortunatamente la funzione Ruby rand() può anche gestire oggetti temporali. Per quanto riguarda l'oggetto Date viene definito quando includi Rails, il metodo rand() viene sovrascritto in modo che possa gestire anche oggetti Date. ad esempio:

# 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: questo codice non funzionerà prima rubino v1.9.3

10

Ok,

Mantenere semplice ..

Date.today-rand (10000) per il precedente risale

Date.today + rand (10000) per le date future

PS. Aumentando/diminuendo il parametro '10000', si modifica l'intervallo di date disponibili.

+6

può essere scritto più semplicemente come 'Date.today-rand (10000)' o 'Date.today + rand (10000)' – fifigyuri

13
rand(Date.civil(1990, 1, 1)..Date.civil(2050, 12, 31)) 

il mio metodo preferito

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 

quindi utilizzare come

random_date = random_date_in_year(2000..2020) 
2

Ecco il mio uno di linea per generare una data casuale negli ultimi 30 giorni (per esempio):

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

Funziona alla grande per il mio ip lorem somma. Ovviamente sarebbero stati risolti minuti e secondi.

0

Per le versioni recenti di Ruby/Rails, è possibile utilizzare rand su un intervallo 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) 

sentitevi liberi di aggiungere to_date, to_datetime, ecc per convertire alla classe preferita

Testato on Rails 5.0.3 e 2.3.3 di Ruby, ma a quanto pare a disposizione da Ruby e Rails 1.9+ 3+

0

La risposta di Mladen è un po 'difficile da capire da un solo sguardo. Ecco la mia opinione su questo.

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

Quanto segue restituisce una data casuale nelle ultime 3 settimane in Ruby (sans Rails).

DateTime.now - (rand * 21)

Problemi correlati