कैसे पता करें कि आज की तारीख एक तिथि सीमा में है?


81

मैं के साथ एक घटना है start_timeऔर end_timeऔर अगर घटना "का कार्य प्रगति पर है" जाँच करना चाहते हैं। यह देखना होगा कि आज की तारीख दो तारीखों के बीच की सीमा में है या नहीं।

आप एक समारोह में यह कैसे करेंगे?

जवाबों:


61

उपयोग ===


दरअसल, एक ऑपरेटर है जो ऐसा करेगा। ऑपरेटर का उपयोग करके ऑब्जेक्ट बनाएं Rangeऔर उसकी तुलना करें ।Time===

start   = Time.now.to_i

range   = start..(start + 2)
inside  = start + 1
outside = start + 3        # ok, now...

range === inside  # true
range === outside # false


अपडेट के बाद टिप्पणी-बाढ़: यह संस्करण हर जगह अच्छी तरह से काम करता है। (रेल में, रूबी 1 में, और रूबी 2 में।) पहले का irbउदाहरण भी ठीक काम करता था लेकिन इंटरैक्टिव उदाहरण हमेशा कुछ प्रयोगों में सही ढंग से पुन: पेश नहीं किया गया था। यह एक कट-एंड-पेस्ट करना आसान है।

अब यह सब सीधा हो गया है।


1
रूबी 1.8.7 पर रेल 3 में काम नहीं करता है, इसलिए मैं @ जवाब नीचे पसंद करता हूं।
सैंड्रो एल


3
यहाँ क्या पकड़ है? अन्य दो टिप्पणियों की तरह, मैंने इस कोड को ठीक से आज़माया, और वही त्रुटि मिलती है। 19 लोगों ने इस जवाब को वोट क्यों दिया? क्या यह कभी काम आया? हीथ का जवाब मेरे लिए काम करता है।
रयान सैंड्रिज

मेरे लिए भी काम नहीं करता है। शायद यह एक पुराने संस्करण में काम करता था, लेकिन अब तक दिखाई नहीं देता है।
20

2
नोट: इसे काम करने के लिए, आपको तिथियों को परिवर्तित करने की आवश्यकता है .to_iऔर फिर ===यह देखने के लिए उपयोग किया जाता है कि क्या वे सीमा में हैं। IMO, .coverage?खजूर के लिए एक बेहतर उपाय है।
एरियल

246

रूबी में 1.9.2 ===काम नहीं करता है, मुझे एक त्रुटि मिलती है:

irb(main):019:0> (Time.now .. (Time.now+1)) === Time.now
TypeError: can't iterate from Time
    from (irb):19:in `each'
    from (irb):19:in `include?'
    from (irb):19:in `include?'
    from (irb):19:in `==='
    from (irb):19
    from /opt/ruby192/bin/irb:12:in `<main>'

इसके बजाय उपयोग करें #cover?:

irb(main):002:0> (Time.now..Time.now+4).cover?(Time.now)
=> true
irb(main):003:0> (Time.now..Time.now+4).cover?(Time.now+10)
=> false

यह वही है जो मुझे माणिक से प्यार है, आप हमेशा एक और शानदार तरीका खोजते हैं जो आपके लिए काम करता है!
डेनियल

अच्छा लगा। मुझे जिस चीज की जरूरत थी। cover?विधि से अनजान था
रियान रेबो

1
साथ Dateही यह काम करता है(Date.yesterday..Date.tomorrow).cover?(Date.today) => true
अमित पटेल

1
रूबी सुंदर है! .. धन्यवाद!
हाथी

===रूबी 1.9.2 में ठीक काम करता है। आप बस भूल गए.to_i
DigitalRoss

38

यदि आप रेल का उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं TimeWithZone#between?। फिर आपके पास कुछ इस तरह होगा:

> start_time = Time.zone.parse('12pm')      => Thu, 26 Jul 2012 12:00:00 EDT -04:00
> end_time = start_time + 1.hour            => Thu, 26 Jul 2012 13:00:00 EDT -04:00
> inside = Time.zone.parse('12:30pm')       => Thu, 26 Jul 2012 12:30:00 EDT -04:00
> outside = Time.zone.parse('1:30pm')       => Thu, 26 Jul 2012 13:30:00 EDT -04:00
> inside.between?(start_time, end_time)     => true
> outside.between?(start_time, end_time)    => false

17

क्योंकि दिनांक वर्ग में तुलनात्मक मॉड्यूल शामिल है, प्रत्येक दिनांक ऑब्जेक्ट में एक between?विधि होती है।

require 'date'

today           = Date.today
tomorrow        = today + 1
one_month_later = today >> 1

tomorrow.between?(today, one_month_later) # => true

कक्षा का समय भी।
adass

यह स्वीकृत उत्तर की तुलना में अधिक पठनीय है। रूबी की शक्तियों का सही उपयोग करने के लिए +1 :)
thutt

5

यदि आप रेल का उपयोग कर रहे हैं, तो आप यह कोशिश कर सकते हैं:

ruby-1.8.7-p299 :015 > a = DateTime.now
 => Fri, 02 Dec 2011 11:04:24 -0800 
ruby-1.8.7-p299 :016 > (a.beginning_of_day..a.end_of_day).include_with_range? a
 => true 
ruby-1.8.7-p299 :017 > (a.beginning_of_day..a.end_of_day).include_with_range? a+10.days
 => false 
ruby-1.8.7-p299 :018 > (a.beginning_of_day..a.end_of_day).include_with_range? a+25.hours
 => false 
ruby-1.8.7-p299 :019 > (a.beginning_of_day..a.end_of_day).include_with_range? a+2.hours
 => true 

नोट: मैंने अभी उपयोग किया है beginning_of_dayऔर end_of_dayएक आसान सीमा प्रदान करता है। include_with_range?एक सीमा पर महत्वपूर्ण हिस्सा विधि है।


ऐसा लगता है कि रेंज # शामिल_हैं_रेंज? ActiveSupport द्वारा प्रदान की गई विधि बस क्षमता जांच को जोड़ती है यदि एक श्रेणी में #include का उपयोग करके एक और सीमा शामिल है ?, उदाहरण के लिए: (1..5) .include? (1..5)। इसके अलावा, यह रूबी के मूल निवासियों के लिए समान रूप से व्यवहार करता है? तरीका। चूंकि आपका तर्क एक और सीमा नहीं है, इसलिए इस ActiveSupport एक्सटेंशन को कोई फर्क नहीं पड़ना चाहिए। किसी भी मामले में, आपको बस कॉल करना चाहिए? और शामिल नहीं हैं? शामिल होने के बाद से बस शामिल करने के लिए एक उपनाम है? (alias_method_chain का उपयोग करके)।
टायलर रिक

a = DateTime.now; (a.beginning_of_day..a.end_of_day) .include_with_range। (a) मेरे लिए झूठा लौटता है (सच नहीं) जब मैंने इसे कंसोल में रेल्स 3.2.8 और रूबी-1.9.3-p194 में आज़माया। (a.beginning_of_day..a.end_of_day) .cover? (a) सही है, फिर भी, इसलिए मैं इसके बजाय इसका उपयोग करूंगा।
टायलर रिक

एक वैध बिंदु। मुझे यकीन नहीं है कि मैंने include_with_rangeइसका उपयोग करने का विकल्प चुना क्योंकि यह ऐसा मामला नहीं था जहां एक रेंज की तुलना में रेंज की जा रही थी। शायद किसी तरह का ब्रेन ट्यूमर। अच्छा पकड़, धन्यवाद @TylerRick। @ हर्ड उत्तर वास्तव में सबसे अच्छा है।
sorens

3

यदि वे टाइमस्टैम्प हैं:

in_progress को हराया?
  (start_time..end_time) .include? (Time.now)
समाप्त

मेरे लिए 1.9.2 पर, इसने एक त्रुटि दीTypeError: can't iterate from Time
बेंजामिन ओक्स

3

चेक की गई वर्तमान तिथि दो तिथियों के बीच है। रूबी का उपयोग करना

currentDate = DateTime.now
start_date = "2017-03-31"
end_date = "2018-03-31"
currentDate.between?(start_date, end_date)

**Out Put Will be** true or false

3

सारांश

  d1      = DateTime.parse('2018/04/01')
  d2      = DateTime.parse('2018/04/29')
  outside = DateTime.parse('2018/04/30')
  inside  = DateTime.parse('2018/04/15')

  # include?
  (d1...d2).include?(d1)      # true
  (d1...d2).include?(d2)      # false
  (d1...d2).include?(outside) # false
  (d1...d2).include?(inside)  # true

  (d1..d2).include?(d1)      # true
  (d1..d2).include?(d2)      # true
  (d1..d2).include?(outside) # false
  (d1..d2).include?(inside)  # true

  # ===
  (d1...d2) === d1      # true
  (d1...d2) === d2      # false
  (d1...d2) === outside # false
  (d1...d2) === inside  # true

  (d1..d2) === d1      # true
  (d1..d2) === d2      # true
  (d1..d2) === outside # false
  (d1..d2) === inside  # true

  # cover?
  (d1...d2).cover?(d1)      # true
  (d1...d2).cover?(d2)      # false
  (d1...d2).cover?(outside) # false
  (d1...d2).cover?(inside)  # true

  (d1..d2).cover?(d1)      # true
  (d1..d2).cover?(d2)      # true
  (d1..d2).cover?(outside) # false
  (d1..d2).cover?(inside)  # true

  # between?
  d1.between?(d1, d2)       # true
  d2.between?(d1, d2)       # true
  outside.between?(d1, d2)  # false
  inside.between?(d1, d2)   # true
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.