मैं रूबी में दो दिनांक वस्तुओं के बीच दिनों की संख्या कैसे पा सकता हूं?


141

मैं दो दिनांक ऑब्जेक्ट्स के बीच दिनों की संख्या कैसे पा सकता हूं?

जवाबों:


170

अंतिम तिथि से आरंभ तिथि घटाएं:

endDate - beginDate 

2
लगता है कि आपका मतलब अंतिम तिथि से शुरू होने की तारीख घटाना है :)
नादेर

99
एंटीक्लिसमैटिक एह की तरह?
ब्रिगेडियर

18
ध्यान दें: यदि आप irb में Wirble का उपयोग कर रहे हैं (आउटपुट को रंग देने के लिए) तो परिमेय संख्या में 1 समाप्ती होगी। ओह! परिणाम को पूर्णांक में बदलने के लिए आप to_i का उपयोग करना चाहते हैं
jwal

9
यदि आपके पास कोई DateTimeऑब्जेक्ट है, तो Dateपहले कन्वर्ट करना सुनिश्चित करें , अन्यथा यह सेकंड की संख्या देता है (मुझे लगता है)।
जोशुआ मुहीम

44
यह भी ध्यान दें कि दो Dateवस्तुओं को घटाना आपको एक Rationalपूर्णांक में टाइपकास्ट करने की आवश्यकता हो सकती है, जैसा कि(endDate - beginDate).to_i
MusikAnimal

98
irb(main):005:0> a = Date.parse("12/1/2010")
=> #<Date: 4911063/2,0,2299161>

irb(main):007:0> b = Date.parse("12/21/2010")
=> #<Date: 4911103/2,0,2299161>

irb(main):016:0> c = b.mjd - a.mjd
=> 20

यह एक संशोधित जूलियन डे नंबर का उपयोग करता है

से विकिपीडिया :

जूलियन तिथि (JD) एक जनवरी, 4713 ईसा पूर्व ग्रीनविच दोपहर, जूलियन प्रोलप्टिक कैलेंडर के बाद से दिनों के अंतराल और एक दिन के अंशों में अंतराल है।


53

हो सकता है कि यह रूबी 2.0 में बदल गया हो

जब मैं ऐसा करता हूं तो मुझे एक अंश मिलता है। कंसोल पर उदाहरण के लिए (या तो irb या rails c)

2.0.0-p195 :005 > require 'date'
 => true 
2.0.0-p195 :006 >  a_date = Date.parse("25/12/2013")
 => #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)> 
2.0.0-p195 :007 >  b_date = Date.parse("10/12/2013")
 => #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)> 
2.0.0-p195 :008 > a_date-b_date
 => (15/1) 

बेशक, एक इंट का कास्टिंग अपेक्षित परिणाम देता है

2.0.0-p195 :009 > (a_date-b_date).to_i
 => 15 

यह डेटटाइम ऑब्जेक्ट्स के लिए भी काम करता है, लेकिन आपको इस उदाहरण जैसे विचार सेकंड में लेना होगा

2.0.0-p195 :017 >   a_date_time = DateTime.now
 => #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)> 
2.0.0-p195 :018 > b_date_time = DateTime.now-20
 => #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)> 
2.0.0-p195 :019 > a_date_time - b_date_time
 => (1727997655759/86400000000) 
2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
 => 19 
2.0.0-p195 :021 > c_date_time = a_date_time-20
 => #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)> 
2.0.0-p195 :022 > a_date_time - c_date_time
 => (20/1) 
2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
 => 20 

29

रूबी में 2.1.3 चीजें बदल गई हैं:

> endDate = Date.new(2014, 1, 2)
 => #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)> 
> beginDate = Date.new(2014, 1, 1)
 => #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)> 
> days = endDate - beginDate
 => (1/1) 
> days.class
 => Rational 
> days.to_i
 => 1 

21

इस बारे में कैसा है?

(beginDate...endDate).count

रेंज अद्वितीय धारावाहिकों का एक समूह है। और ...एक एक्सक्लूसिव रेंज शाब्दिक है।

तो beginDate..(endDate - 1)वही है। को छोड़कर नहीं है।

मामले में जब में BeginDate के बराबर होती है ENDDATE , पहला तत्व विशिष्टता की वजह से बाहर रखा जाएगा और ...पिछले एक को बाहर निकाल देगा। इसलिए अगर हम .countआज और आज के बीच तारीखें चाहते हैं तो यह 0 पर वापस आ जाएगी।


यह एक बहुत अच्छा जवाब है, अगर शुरुआती एंडेडेट से पुराना है, तो यह वापस आ जाएगा 0, जो कुछ मामलों पर पूरी तरह से काम करता है। इसके अलावा, अगर दो तारीखें समान हैं, तो यह 0. वापस आ जाएगी। यह एक सादे पूर्णांक भी देता है। अन्य उत्तरों को पूर्णांक में बदलना होगा या यदि परिणाम नकारात्मक है तो आपको 0 में अनुवाद करना पड़ सकता है।
EmmanuelB



6

इन सभी ने मुझे सही नतीजे पर पहुंचा दिया, लेकिन मैंने कर दिखाया

DateTime.now.mjd - DateTime.parse("01-01-1995").mjd

इंगित करने के लिए एक tidbit: Ruby में DateTime.parse को डीडी / MM / YYYY, या DD-MM-YYYY के रूप में दी जाने वाली तारीख की उम्मीद है। एक अमेरिकी के रूप में, यह हमेशा मुझे फेंकता है!
रिकुमली

15
@rickumali बाकी दुनिया से एक सदस्य के रूप में, मैं रूबी को "हमारे" डिफ़ॉल्ट तिथि प्रारूप का उपयोग करने के लिए धन्यवाद देता हूं।
क्लाउडियो होलांडा

7
@rickumali रूबी YYYY-MM-DDप्रारूप में तारीख को भी स्वीकार करती है , जो कि सभी को वैसे भी उपयोग करना चाहिए।
user513951

1

दिन = (अंतिम तिथि - आरंभ) / (60 * 60 * 24)


5
तिथि दिनों के अनुसार है, इसलिए आपको ऐसा करने की आवश्यकता नहीं है। मुझे लगता है कि आपका समाधान डेटटाइम अंतर के साथ प्रासंगिक हो जाता है।
सुग्गा_शीन

1

ठीक है, आप "बीच" से क्या मतलब है इसका भी ध्यान रखें ...

days_apart = (to - from).to_i     # from + days_apart = to
total_days = (to - from).to_i + 1 # number of "selected" days
in_between_days = (to - from).to_i - 1 # how many days are in between from and to, i.e. excluding those two days
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.