Non trascurare la parte 'data E ora' però.Come generare una data e un'ora casuali tra due date?
risposta
Time.at((date2.to_f - date1.to_f)*rand + date1.to_f)
Otterrai un oggetto orario compreso tra due determinati datetimes.
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.
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.
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()
.
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))
A mio parere, questa soluzione è molto più bella di quella attualmente accettata da Evgeny. – severin
Una piccola osservazione, tuttavia: '1.year.ago' funziona solo se hai * support * attivo * caricato ... – severin
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. –
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)
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)
Time.at(rand(Time.parse('some date').to_i..Time.now.to_i))
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' –
+1 semplice, al punto, bello. Grazie molto. –
Ho bisogno di trovare un modo per darti un altro +1 - 2a volta questa settimana mi sono riferito a questa risposta! –