2010-04-21 44 views

Trả lời

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

Bạn sẽ nhận được đối tượng thời gian nằm giữa hai khoảng thời gian đã cho.

+8

Đây là một giải pháp tuyệt vời tuy nhiên một lưu ý có thể được theo thứ tự; bạn sẽ cần phải chuyển đổi ngày của bạn thành một thời gian để gọi 'to_f' trên đó. 'Date' không có' to_f'. tức là 'Date.today.to_time' –

+0

+1 đơn giản, cho đến điểm, đẹp. Cảm ơn nhiều. –

+0

Tôi cần tìm cách cung cấp cho bạn +1 khác - lần thứ 2 trong tuần này tôi đã đề cập đến câu trả lời này! –

2

Tôi không biết về ruby ​​nhưng tại sao bạn không chỉ tạo ra một số nguyên và sử dụng nó cùng với dấu thời gian? Sau đó, chỉ cần chuyển dấu thời gian sang định dạng mong muốn của bạn.

0

Tính chênh lệch trong ví dụ phút giữa hai ngày, tạo số ngẫu nhiên giữa 0 và số đó, và thêm số phút đó vào ngày đầu tiên.

4

Sử dụng time.to_i() (xem lớp Time) để chuyển đổi ngày thành số nguyên, ngẫu nhiên giữa hai giá trị đó, sau đó hoàn nguyên về thời gian và ngày với Time.at().

29

Bạn sẽ có thể tạo ngày/giờ ngẫu nhiên trong một phạm vi nhất định.

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) 

đầu vào của bạn cần phải là lớp Time, hoặc chuyển đổi thành một dù.

Bạn cũng có thể thực hiện một khoảng thời gian trong thời gian epoch và sau đó sử dụng Time#at.

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

Theo tôi, giải pháp này đẹp hơn nhiều so với hiện tại được chấp nhận bởi Evgeny. – severin

+1

Một nhận xét nhỏ, mặc dù: '1.year.ago' chỉ hoạt động khi bạn có * activesupport * nạp ... – severin

+0

Điểm tốt @severin. Tôi đã bao gồm mã để hỗ trợ có và không có activesupport được tải. Cũng đã thêm một ví dụ cho các khoảng thời gian epoch. –

0

Nếu bạn biết trung điểm và phạm vi bù đắp vào hai bên của trung điểm bạn có thể sử dụng đá quý ish của tôi: https://github.com/spilliton/ish

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

Sử dụng phương pháp 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)) 
Các vấn đề liên quan