2010-04-21 3 views

risposta

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

Otterrai un oggetto orario compreso tra due determinati datetimes.

+8

Questa è una grande soluzione tuttavia una nota può essere in ordine; dovrai convertire la tua data in un'ora per chiamare 'to_f' su di essa. 'Date' non ha un' to_f'. , ad esempio "Date.today.to_time' –

+0

+1 semplice, al punto, bello. Grazie molto. –

+0

Ho bisogno di trovare un modo per darti un altro +1 - 2a volta questa settimana mi sono riferito a questa risposta! –

2

Non so rubino ma perché non si genera un numero intero e lo si utilizza insieme a un timestamp? Quindi converti semplicemente il timestamp nel formato desiderato.

0

Calcolare la differenza in minuti di esempio tra le due date, generare un numero casuale compreso tra 0 e quel numero e aggiungere quel numero di minuti alla prima data.

4

Utilizzare time.to_i() (vedere classe Time) per convertire le date in numero intero, randomizzare tra questi due valori, quindi riconvertire in data e ora con Time.at().

29

Dovresti essere in grado di generare date/orari casuali all'interno di un determinato intervallo.

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) 

I suoi ingressi devono essere la classe Time, o convertiti in un unico però.

Si potrebbe anche fare un intervallo di tempo in epoca e quindi utilizzare Time#at.

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

A mio parere, questa soluzione è molto più bella di quella attualmente accettata da Evgeny. – severin

+1

Una piccola osservazione, tuttavia: '1.year.ago' funziona solo se hai * support * attivo * caricato ... – severin

+0

Buon punto @ sempre. Ho incluso il codice per il supporto con e senza il supporto di actives caricato. Aggiunto anche un esempio per gli intervalli di tempo di epoca. –

0

Se si conosce il punto medio e la gamma di offset su entrambi i lati del punto medio è possibile utilizzare la mia gemma ish: https://github.com/spilliton/ish

mid_date.ish(:offset => 60.days) 
4

utilizzare il metodo 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))