Moment.js: तारीखों के बीच की तारीख


118

अगर कोई दी गई तारीख दो तारीखों के बीच है, तो मैं Moment.js के साथ पता लगाने की कोशिश कर रहा हूं। संस्करण 2.0.0 के बाद से, टिम ने जोड़ा isBefore()और isAfter()तारीख की तुलना के लिए।

चूंकि कोई isBetween()विधि नहीं है, मैंने सोचा कि यह काम करेगा:

var date = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");

if (date.isBefore(endDate) && date.isAfter(startDate) || (date.isSame(startDate) || date.isSame(endDate)) ) { alert("Yay!"); } else { alert("Nay! :("); }

मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका हो गया है। कोई विचार?


मुझे विश्वास है कि आप चाहते थे ? isBetween || isStart || isEnd
बरगी

जवाबों:


82

आप तिथि सीमा से निपटने के लिए एक क्षण प्लगइन -> क्षण-श्रेणी का उपयोग कर सकते हैं :

var startDate = new Date(2013, 1, 12)
  , endDate   = new Date(2013, 1, 15)
  , date  = new Date(2013, 2, 15)
  , range = moment().range(startDate, endDate);

range.contains(date); // false

1
आप प्लगइन कैसे शामिल करते हैं?

2
आपको बस <script src = "/ javascripts / moment-range.js"> </ script> को क्षणिकाओं के बाद शामिल करना चाहिए
Lukasz Koziara

53
date.isBetween (startDate, endDate); बहुत सरल है और एक अतिरिक्त प्लगइन की आवश्यकता से बचा जाता है।
ब्रेंडन नी

क्षण और क्षण-सीमा, रेंज तैयार करते समय दिनांक समय प्रारूप करने के लिए विकल्प प्रदान करता है और फिर समसामयिकी / भीतर / ओवरलैप्स / अंतर / जोड़ / घटाव के लिए तारीखों की तुलना करता है। यदि कुछ विशेष प्रारूप में तारीखों को पुनः प्राप्त करते हैं, तो कोई उन तिथियों को आवश्यक प्रारूप के साथ परिवर्तित करके सरणी के अंदर दिनांक सीमाएं तैयार करने में सक्षम हो सकता है और फिर हम तुलना कर सकते हैं।
सज्जाद अली खान

277

में संस्करणों 2.9+ एक है isBetweenसमारोह है, लेकिन यह विशेष है:

var compareDate = moment("15/02/2013", "DD/MM/YYYY");
var startDate   = moment("12/01/2013", "DD/MM/YYYY");
var endDate     = moment("15/01/2013", "DD/MM/YYYY");

// omitting the optional third parameter, 'units'
compareDate.isBetween(startDate, endDate); //false in this case

एक समावेशी समाधान है ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... जो तार्किक रूप से समतुल्य है
!(x.isBefore(a) || x.isAfter(b))


में संस्करण 2.13isBetween समारोह, चौथी वैकल्पिक पैरामीटर है inclusivity

इसे इस तरह उपयोग करें:

target.isBetween(start, finish, 'days', '()') // default exclusive
target.isBetween(start, finish, 'days', '(]') // right inclusive
target.isBetween(start, finish, 'days', '[)') // left inclusive
target.isBetween(start, finish, 'days', '[]') // all inclusive

अधिक इकाइयों पर विचार करने के लिए: years, months, days, hours, minutes, seconds, milliseconds

नोट: इकाइयां अभी भी वैकल्पिक हैं। nullतीसरे तर्क के रूप में उन इकाइयों की अवहेलना के लिए उपयोग करें जिनमें मिलीसेकंड डिफ़ॉल्ट ग्रैन्युलैरिटी है।

आधिकारिक डॉक्स पर जाएं


3
नंगे दिमाग में, जैसा कि डॉक्स में बताया गया है, बाइटवीन अनन्य है
जोकिन एल। रॉबल्स

x.isBetween(moment(a).subtract(1, 'day'), b)के रूप में अच्छी तरह से चाल करने के लिए लगता है।
जेम्स डोनली

@ThisClark यह एक अच्छा समाधान है; क्या मैं कम फ़ंक्शन कॉल के साथ एक और सुझाव दे सकता हूं:!(x.isBefore(a) || x.isAfter(b))
14

क्या exclusiveमतलब है?
बैटमैन

2
@ बैटमैन सूची 1,2,3,4,5 पर विचार करें। विशेष रूप से, 1 और 5 इस सूची के मूल्यों के बीच नहीं हैं। समावेशी, 1 और 5 इस सूची के मूल्यों के बीच हैं। लेफ्ट इनक्लूसिव (राइट एक्सक्लूसिव के समान) में 1 शामिल है, लेकिन 5 नहीं। राइट इनक्लूसिव (लेफ्ट एक्सक्लूसिव के रूप में) में 5 शामिल हैं, लेकिन 1 नहीं।
ThisClark

27

आप उपयोग कर सकते हैं

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);

या

moment().isBetween(moment-like, moment-like);

यहां देखें: http://momentjs.com/docs/#/query/


2
त्वरित नोट: isBetweenपल की आवश्यकता है 2.13.0। momentjs.com/docs/#/query/is-between
एलेक्स जॉनसन

16

मुझे विश्वास है कि

if (startDate <= date && date <= endDate) {
  alert("Yay");
} else {
  alert("Nay! :("); 
}

काम करता है ...


यह गणना हमेशा वर्ष की उपेक्षा करती है। उदाहरण के लिए, यदि मैं startDate = '05 -01-2019 ', endDate = '05 -31-2019' और दिनांक '05 -21-2017 'के रूप में देता हूँ, तो यह मुझे "Yay" के रूप में परिणाम देगा, हालाँकि यह गलत है। ।
आकाश मौर्य

1
@ आकाशवाणी आप तार की तुलना कर रहे हैं, तिथियों की नहीं। सुनिश्चित करें कि आप अपनी शुरुआत / एंडडेट को स्टार्टडेट = नई तिथि ("05-01-2019") के रूप में परिभाषित करते हैं।
टाईले डेक्लेर्क

13

सभी को अच्छी खबर है, वहाँ एक isBetweenसमारोह है! अपनी लाइब्रेरी अपडेट करें;)

http://momentjs.com/docs/#/query/is-between/


2
सच है, लेकिन isBetweenसमावेशी नहीं है
एपोक

4
संस्करण 2.13.0 विशिष्टता का परिचय देता है। A [एक मूल्य को शामिल करने का संकेत देता है। A (बहिष्करण को इंगित करता है। यदि समावेशी पैरामीटर का उपयोग किया जाता है, तो दोनों संकेतक पास होने चाहिए।moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
रामरतन गुप्ता

8

कृपया क्षण के चौथे पैरामीटर का उपयोग करें। बूटनेट फ़ंक्शन (समावेशिता)। उदाहरण:

var startDate = moment("15/02/2013", "DD/MM/YYYY");
var endDate = moment("20/02/2013", "DD/MM/YYYY");

var testDate = moment("15/02/2013", "DD/MM/YYYY");

testDate.isBetween(startDate, endDate, 'days', true); // will return true
testDate.isBetween(startDate, endDate, 'days', false); // will return false

5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

तार्किक रूप से समान है

if (!(date.isBefore(startDate) || date.isAfter(endDate)))

जो आपको कोड की कुछ पंक्तियों और (कुछ मामलों में) कॉल को बचाता है।

यदि आप केवल एक या दो बार ऐसा करना चाहते हैं, तो पूरे प्लगइन को खींचना आसान हो सकता है।


1

पल js के प्रलेखन के अनुसार,

रॉब डॉसन द्वारा लिखित सटीक रेंज प्लगइन है, जिसका उपयोग सटीक, मानव-पठनीय तारीखों / समय सीमाओं, url: http://codebox.org.uk/pages/moment-date-range-plugin को प्रदर्शित करने के लिए किया जा सकता है

moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds

moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.