2011-02-04 18 views
26

que tienen un modelo en mi aplicación Rails 3 que tiene un campo date:¿Cómo generar una fecha aleatoria en Ruby?

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

quisiera rellenar previamente mi base de datos con los valores de fecha al azar.

¿Cuál es la forma más fácil de generar una fecha aleatoria?

+0

¿no puedes simplemente hacer Time.now? ¿O realmente necesitas usar fechas aleatorias? – corroded

+1

Realmente quiero tener valores aleatorios :) –

Respuesta

54

Aquí hay una ligera expansión en la respuesta de Chris, con la opción de from y to parámetros:

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

¡Genial! Muchas gracias :) –

+3

Funciona. Me preguntaba si podría simplificarse con 'Time.at (rand * Time.now.to_f)'? –

+1

¡Me pregunto cuándo se convertirá en parte del núcleo de rubí! Como 'rand (date1..date2)'! –

40

Prueba esto:

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

Esto generará una fecha aleatoria de época hasta ahora – tothemario

+0

Corto y dulce, me gusta. – sevenseacat

+0

¡Gracias por esto! Es corto y muy a prueba de tontos. – Ravenstine

3

Aquí también una más (en mi opinión) mejor versión de Mladen de fragmento de código. Afortunadamente, la función rand() de Ruby también puede manejar Time-Objects. Con respecto al Date-Object se define al incluir Rails, el método rand() se sobrescribe para que pueda manejar también Date-Objects. por ejemplo:

# 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 

Editar: este código no funcionará antes de v1.9.3 rubí

10

Ok,

Mantener sencilla ..

Date.today-rand (10000) para la anterior data

Date.today + rand (10000) para fechas futuras

PS. Incrementando/Disminuyendo el parámetro '10000', cambia el rango de fechas disponibles.

+6

se puede escribir más simple como 'Date.today-rand (10000)' o 'Date.today + rand (10000)' – fifigyuri

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

mi método favorito

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 

a continuación, utilizar como

random_date = random_date_in_year(2000..2020) 
2

Aquí está mi un trazador de líneas para generar una fecha aleatoria en los últimos 30 días (por ejemplo):

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

Funciona muy bien para mi lorem ip suma. Obviamente, se arreglarían los minutos y los segundos.

0

Para las versiones recientes de Ruby/Rails, puede usar rand en un rango 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) 

agrega a to_date, to_datetime, etc. para convertir a su clase favorita

Probado en Rails 5.0.3 y 2.3.3 de Ruby, pero al parecer a disposición del Ruby y Rails 1.9+ 3+

0

La respuesta de Mladen es un poco difícil de entender con solo una mirada. Aquí está mi opinión sobre esto.

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

Lo siguiente devuelve una fecha aleatoria en las últimas 3 semanas en Ruby (sans Rails).

DateTime.now - (rand * 21)

Cuestiones relacionadas