2010-04-21 24 views

Respuesta

56
Time.at((date2.to_f - date1.to_f)*rand + date1.to_f) 

Obtendrá un objeto de tiempo entre dos fechas determinadas.

+8

Esta es una gran solución sin embargo una nota puede estar en orden; necesitará convertir su fecha a una hora para llamar a 'to_f' en ella. 'Date' no tiene' to_f'. es decir 'Date.today.to_time' –

+0

+1 simple, al grano, hermoso. Muchas gracias. –

+0

Necesito encontrar una manera de darte otro +1 - 2º vez esta semana ¡Me he referido a esta respuesta! –

2

No sé sobre ruby ​​pero ¿por qué no solo genera un entero y lo usa junto con una marca de tiempo? Luego simplemente convierta la marca de tiempo al formato deseado.

0

Calcule la diferencia en, por ejemplo, minutos entre las dos fechas, genere un número aleatorio entre 0 y ese número, y agregue ese número de minutos a la primera fecha.

4

Use time.to_i() (vea la clase Time) para convertir sus fechas en números enteros, aleatorice entre esos dos valores, luego reconvélelos a la hora y la fecha con Time.at().

29

Debería poder generar fechas/tiempos aleatorios dentro de un cierto rango.

now = Time.now 
a_day_ago = now - 60 * 60 * 24 

random_time = rand(a_day_ago..now) 

# with activesupport required 
up_to_a_year_ago = rand(1.year.ago..Time.now) 

Sus entradas tienen que ser la clase Time, o se convierten en uno sin embargo.

También podría hacer un rango de tiempo en tiempo de época y luego usar Time#at.

now = Time.now.to_i 
minute_ago = (Time.now - 60).to_i 
Time.at(rand(minute_ago..now)) 
+0

En mi opinión, esta solución es mucho mejor que la actualmente aceptada por Evgeny. – severin

+1

Una pequeña observación, sin embargo: '1.year.ago' solo funciona cuando tienes * activesupport * cargado ... – severin

+0

Buen punto @severin. Incluí el código para el soporte con y sin soporte activo cargado. También se agregó un ejemplo para intervalos de tiempo de época. –

4

utilizar el método de rand().

require 'time' 
t1 = Time.parse("2015-11-16 14:40:34") 
t2 = Time.parse("2015-11-20 16:20:23") 
puts rand(t1..t2) 
0
Time.at(rand(Time.parse('some date').to_i..Time.now.to_i)) 
Cuestiones relacionadas