2011-02-04 30 views
26

मेरे पास मेरे रेल 3 एप्लिकेशन में एक मॉडल है जिसमें date फ़ील्ड है:रुबी में यादृच्छिक तिथि कैसे उत्पन्न करें?

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

मैं यादृच्छिक दिनांक मानों के साथ अपने डेटाबेस को पूर्ववत करना चाहता हूं।

यादृच्छिक तिथि उत्पन्न करने का सबसे आसान तरीका क्या है?

+0

क्या आप बस समय नहीं कर सकते हैं। अब? या क्या आपको वास्तव में यादृच्छिक तिथियों का उपयोग करने की आवश्यकता है? – corroded

+1

मैं वास्तव में यादृच्छिक मान रखना चाहता हूं :) –

उत्तर

54

यहाँ, 'क्रिस जवाब पर एक मामूली विस्तार है वैकल्पिक from और to मानकों के साथ:

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

ग्रेट !! बहुत बहुत धन्यवाद :) –

+3

यह काम करता है। बस सोच रहा है कि इसे 'Time.at (रैंड * Time.now.to_f)' के साथ सरलीकृत किया जा सकता है? –

+1

मैं सोच रहा हूं कि यह रूबी कोर का हिस्सा बन जाएगा! 'रैंड की तरह (date1..date2)'! –

40

इस प्रयास करें:

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

यह युग से अब तक की यादृच्छिक तिथि उत्पन्न करेगा – tothemario

+0

छोटा और प्यारा, मुझे यह पसंद है। – sevenseacat

+0

इसके लिए धन्यवाद! यह छोटा और बहुत मूर्ख-प्रमाण है। – Ravenstine

3

यहाँ भी एक और अधिक (मेरी राय में) म्लादेन के सुधार संस्करण है सांकेतिक टुकड़ा। सौभाग्य से रूबी का रैंड() फ़ंक्शन टाइम ऑब्जेक्ट्स को भी संभाल सकता है। दिनांक-वस्तु के बारे में रेल समेत परिभाषित किया जाता है, रैंड() विधि ओवरराइट हो जाती है ताकि यह डेट-ऑब्जेक्ट्स को भी संभाल सके। उदाहरण के लिए:

# 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 

संपादित करें: इस कोड को गहरे लाल रंग का v1.9.3

10

ठीक से पहले काम नहीं करेगा,

सरल रखते हुए ..

Date.today-रैंड (10000) पिछले के लिए तारीखें

Date.today + भविष्य दिनांकों

पी एस के लिए रैंड (10000)। '10000' पैरामीटर को बढ़ाने/घटाना, उपलब्ध तिथियों की सीमा को बदलता है।

+6

इसे 'डेट.today-rand (10000) 'या' date.today + rand (10000) 'के रूप में सरल लिखा जा सकता है। – fifigyuri

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

मेरी पसंदीदा विधि

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 

तो जैसे

random_date = random_date_in_year(2000..2020) 
2

यहाँ का उपयोग अपने एक लाइनर एक यादृच्छिक (उदाहरण के लिए) पिछले 30 दिनों में तारीख उत्पन्न करने के लिए है:

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

मेरे लॉरेम आईपी के लिए बहुत अच्छा काम करता है योग। जाहिर है मिनट और सेकंड तय किया जाएगा।

0

रुबी/रेल के हाल के संस्करणों के लिए, आप randTime रेंज ❤️ पर उपयोग कर सकते हैं !!

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) 

to_date, to_datetime, आदि जोड़ने के लिए अपने पसंदीदा वर्ग

ऑन रेल्स 5.0.3 और रूबी 2.3.3 परीक्षण करने के लिए कनवर्ट करने के लिए स्वतंत्र है, लेकिन रूबी से जाहिरा तौर पर उपलब्ध महसूस 1.9+ और रेल 3+

0

मालाडन का जवाब केवल एक ही रूप से समझना थोड़ा मुश्किल है। यहां मेरा लेना है।

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

निम्नलिखित रूबी (सैन्स रेल) ​​में पिछले 3 सप्ताह में यादृच्छिक दिनांक-समय देता है।

DateTime.now - (rand * 21)

संबंधित मुद्दे