जावास्क्रिप्ट दिनांक वस्तु तुलना


86

जावास्क्रिप्ट में दिनांक वस्तुओं की तुलना करते समय मैंने पाया कि समान तिथि की तुलना करने पर भी यह सच नहीं होता है।

 var startDate1 = new Date("02/10/2012");
 var startDate2 = new Date("01/10/2012");
 var startDate3 = new Date("01/10/2012");
 alert(startDate1>startDate2); // true
 alert(startDate2==startDate3); //false

मैं इन तारीखों की समानता की तुलना कैसे कर सकता हूं? मैं Dateजेएस की मूल वस्तु का उपयोग करने में दिलचस्पी रखता हूं और किसी भी तीसरे पक्ष के पुस्तकालयों से नहीं क्योंकि इसकी तारीखों की तुलना करने के लिए किसी तीसरे पक्ष के जेएस का उपयोग करना उचित नहीं है।


15
यह जावास्क्रिप्ट में खराब तरीके से कैसे बनाया गया है, इसका उत्कृष्ट उदाहरण।
— devios1

जवाबों:


131

ऐसा इसलिए है क्योंकि दूसरे मामले में, वास्तविक दिनांक ऑब्जेक्ट्स की तुलना की जाती है, और दो ऑब्जेक्ट कभी भी एक दूसरे के बराबर नहीं होते हैं। उन्हें संख्या के लिए बाध्य करें:

 alert( +startDate2 == +startDate3 ); // true

यदि आप संख्या में अधिक अन्वेषण रूपांतरण चाहते हैं, तो उपयोग करें:

 alert( startDate2.getTime() == startDate3.getTime() ); // true

या

 alert( Number(startDate2) == Number(startDate3) ); // true

ओह, युक्ति का एक संदर्भ: .911.9.3 सार समानता तुलनात्मक एल्गोरिथम जो मूल रूप से वस्तुओं की तुलना करते समय कहता है, obj1 == obj2केवल तभी सत्य है जब वे एक ही वस्तु को संदर्भित करते हैं, अन्यथा परिणाम गलत है।


5
@AndrewD। इस विशेष मामले में सख्त बराबरी का उपयोग करने से परिणामों पर कोई फर्क नहीं पड़ता है, यह इसलिए है क्योंकि उदाहरणों में बराबर ऑपरेटर, हमेशा एक ही प्रकार के ऑपरेंड के साथ काम कर रहा है, @RobG मानों को स्पष्ट रूप से संख्या में परिवर्तित कर रहा है (उदाहरण 1 और) 3) या उदाहरण 2 में, हम जानते हैं कि Date.prototype.getTimeहमेशा एक नंबर वापस आएगा ...
— क्रिश्चियन सी। साल्वादो

12
FYI करें, इन दृष्टिकोणों के बीच एक महत्वपूर्ण प्रदर्शन अंतर है: jsperf.com/date-equality-comparison
— Nick

2
@ निक - यहां तक ​​कि सबसे धीमी संस्करण को चलाने के लिए एक माइक्रोसेकंड से भी कम समय लगता है, इसलिए तुलनात्मक मतभेद होने पर, निरपेक्ष रूप से प्रदर्शन अंतर नगण्य है। ओपी को केवल जो भी दृष्टिकोण सबसे अच्छा लगता है, का उपयोग करना चाहिए, संभावना getTimeस्पष्टता के लिए सबसे अच्छा है (और उन ब्राउज़रों में सबसे तेज़ होना चाहिए जो मैंने भी परीक्षण किए हैं)।
— 5

2
@ रोब आप जानते हैं, आप बिल्कुल सही हैं। =) मैं एक पुस्तकालय लिख रहा था और एक परीक्षण किया "बस क्यूज़।" असली सॉफ्टवेयर में इससे कोई फर्क नहीं पड़ता।
— निक ज़ालुत्सिकी


24

getTime()युगों से मिलीसेकंड की वापसी संख्या (यानी एक संख्या) का उपयोग करते हुए तारीखों की तुलना करें :

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");
var startDate3 = new Date("01/10/2012");
alert(startDate1.getTime() > startDate2.getTime()); // true
alert(startDate2.getTime() == startDate3.getTime()); //true

इसके अलावा Dateनिर्माणकर्ता का उपयोग स्पष्ट वर्ष / माह / तारीख संख्या लेने पर विचार करें, फिर स्ट्रिंग प्रतिनिधित्व पर निर्भर करें (देखें: Date.parse () )। और याद रखें कि जावास्क्रिप्ट में तिथियां हमेशा क्लाइंट (ब्राउज़र) टाइमज़ोन का उपयोग करके प्रस्तुत की जाती हैं।


1
तारीख () के तर्क के रूप में स्ट्रिंग के उपयोग पर टिप्पणी के लिए +1।
— रॉबग

16

आपको गेटटाइम विधि का उपयोग करने की आवश्यकता नहीं है- आप किसी दिनांक ऑब्जेक्ट को किसी अन्य दिनांक ऑब्जेक्ट से घटा सकते हैं। यह मिलीसेकंड अंतर लौटाएगा (नकारात्मक, यदि दूसरा बाद की तारीख है)

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");

var diff= (startDate1 -startDate2)

// 0 का मूल्यांकन करता है यदि तिथियों में समान टाइमस्टैम्प है


+1 सरल और सुरुचिपूर्ण, इमो पसंदीदा समाधान: यह एक न्यूमेरिक टाइमस्टैम्प के लिए जबरदस्ती की आवश्यकता के बिना अंतर्निहित तिथि मूल्यांकन कार्यक्षमता का उपयोग करता है
— gdibble

5

आप वास्तविक मिलीसेकंड की तुलना कर सकते हैं:

alert(startDate2.getTime() === startDate3.getTime());

0

आप फ़ंक्शन मान का उपयोग भी कर सकते हैं ()

 var startDate1 = new Date("02/10/2012").valueOf();
 var startDate2 = new Date("01/10/2012").valueOf();
 var startDate3 = new Date("01/10/2012").valueOf();
 alert(startDate1>startDate2); // 1326150000000 > 1328828400000   true
 alert(startDate2==startDate3); // 1328828400000 > 1326150000000  false
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.