जावास्क्रिप्ट के साथ दो तारीखों की तुलना करें


1949

क्या कोई जावास्क्रिप्ट से अधिक अतीत की तुलना में दो तारीखों के मूल्यों की तुलना करने का एक तरीका सुझा सकता है, जो अतीत में नहीं है? मान टेक्स्ट बॉक्स से आ रहे होंगे।


17
जब यह जेएस में डेटटाइम और हेरफेर की बात आती है, तो मैं क्षणभंगुर की तुलना में आगे नहीं देखता हूं :)
हैल्सियोन

47
2 तिथियों की तुलना करने के लिए संवेगों का उपयोग करने की आवश्यकता नहीं है। बस शुद्ध जावास्क्रिप्ट तिथि वस्तु का उपयोग करें। अधिक विवरण के लिए मुख्य उत्तर की जाँच करें।
लुकास लाइजिस

आप निम्नलिखित उत्तर देख सकते हैं: stackoverflow.com/questions/4812152/… getDateDifference और getDifferenceInDays की जाँच करें यदि यह मदद कर सकता है।
विकाश राजपुरोहित 10

मैं आपको Moment.js ( जो मुझे पसंद है, लेकिन ... ) से आगे देखने का एक कारण देगा : लूपिंग लोड के लिए उपयोग न करें
गीक स्टॉक

एक उपयोगी फ़ंक्शन के लिए इकाइयों (सेकंड, मिनट, घंटे, आदि) में अंतर को अलग करने के लिए , stackoverflow.com/questions/1968167/… पर उत्तर देखें । यह उत्तर अब stackoverflow.com/a/46529159/3787376 पर भी उपलब्ध है ।
एडवर्ड

जवाबों:


2283

दिनांक वस्तु है, तो प्रत्येक तिथि के लिए निर्माण एक का उपयोग कर उनकी तुलना - तुम क्या चाहते हो जाएगा >, <, <=या >=

==, !=, ===, और !==ऑपरेटर आपको उपयोग करने के लिए आवश्यकता होती है date.getTime()के रूप में

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

स्पष्ट होने के लिए सिर्फ तारीख वस्तुओं के साथ सीधे समानता के लिए जाँच करना काम नहीं करेगा

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

मेरा सुझाव है कि आप पाठ बॉक्स के बजाय ड्रॉप-डाउन या डेट एंट्री के कुछ इसी तरह के विवश रूप का उपयोग करें, हालांकि, ऐसा न हो कि आप इनपुट सत्यापन नरक में खुद को पाते हैं।


64
यहां तक ​​कि ऐस की विधि भी विफल नहीं है। आपको पहले मिलीसेकंड को रीसेट करने की आवश्यकता है, और आप पूरे समय को रीसेट करना भी चाह सकते हैं। date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); कि .getTime () का उपयोग करने के साथ संयुक्त आपको सटीक तुलना परिणाम देगा
पैट्रिक

102
@patrick, setHours(0,0,0,0)इस तरह से कॉल करने का सुझाव दें । कॉलिंग setMinutes()आदि की आवश्यकता को समाप्त करता है।
कार्ल

26
बचने के लिए == या === वांछित परिणाम पाने के लिए: jsfiddle.net/P4y5J अभी> = एक और अब और& अब <= एक और सच है FYI करें
जेसन सेब्रिंग

5
बस toString()दोनों तिथियों पर विधि का उपयोग क्यों न करें और फिर ==ऑपरेटर के साथ तुलना करें ? समय को रीसेट करने और बाद में तुलना करने की तुलना में बहुत आसान लगता है, क्या इसके लिए कोई कमियां हैं?
user2019515

13
वस्तुओं की तुलना करने से बचने के लिए आप अपनी तिथियों के संख्यात्मक मूल्यों की तुलना भी कर सकते हैं: date1.valueOf () == date2.valueOf ()
madprog

421

जावास्क्रिप्ट में तारीखों की तुलना करने का सबसे आसान तरीका यह है कि पहले इसे किसी दिनांक ऑब्जेक्ट में परिवर्तित करें और फिर इन दिनांक-ऑब्जेक्ट्स की तुलना करें।

नीचे आपको तीन कार्यों के साथ एक वस्तु मिलती है:

  • dates.compare (क, ख)

    एक नंबर लौटाता है:

    • -1 अगर एक <बी
    • 0 अगर ए = बी
    • 1 अगर एक> बी
    • NaN यदि a या b अवैध दिनांक है
  • date.inRange (d, start, end)

    एक बूलियन या NaN लौटाता है:

    • सच है अगर d शुरू और अंत के बीच है (समावेशी)
    • असत्य है यदि d शुरुआत से पहले या अंत के बाद है ।
    • NaN यदि एक या अधिक तिथियां अवैध हैं।
  • dates.convert

    अपने इनपुट को डेट ऑब्जेक्ट में बदलने के लिए अन्य फ़ंक्शन द्वारा उपयोग किया जाता है। इनपुट हो सकता है

    • एक दिनांक -object: इनपुट के रूप में वापस आ गया है।
    • एक सरणी : [वर्ष, माह, दिन] के रूप में व्याख्या की गई। नोट महीने 0-11 है।
    • एक संख्या : 1 जनवरी 1970 (एक टाइमस्टैम्प) के बाद से मिलीसेकंड की संख्या के रूप में व्याख्या की गई
    • एक स्ट्रिंग : कई अलग-अलग स्वरूपों का समर्थन किया जाता है, जैसे "YYYY / MM / DD", "MM / DD / YYYY", "Jan 31 2009" आदि।
    • एक वस्तु : वर्ष, महीने और तारीख विशेषताओं के साथ एक वस्तु के रूप में व्याख्या की गई। नोट महीने 0-11 है।

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}

11
(a > b) - (a < b)दिनांक सरणी के लिए उपयोगी है
nktssh

@ मिनीता हाँ यह है, और एक फ़ंक्शन जो उस परिणाम को लौटाता है Array.prototype.sortजब तक कि सभी मान मान्य तिथियों के साथ उपयोग किए जा सकते हैं। अगर कोई अमान्य तिथियां हो सकता है, मैं की तरह कुछ का उपयोग करेंfunction ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; }
कुछ

4
@ nktssh- हो सकता है, लेकिन return a - bसरल है और पूरे विवरण को बदल देता है।
23

284

तुलना करें <और >हमेशा की तरह, लेकिन इसमें शामिल कुछ भी =एक +उपसर्ग का उपयोग करना चाहिए । इस तरह:

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

उम्मीद है की यह मदद करेगा!


81
बहुत धीमी गति से :) मैं x.getTime() === y.getTime()विधि पसंद करता हूं , दोनों पठनीय और बहुत तेज़ देख सकते
huysentruitw

24
+ऑपरेटर एक संख्या में अभिव्यक्ति कन्वर्ट करने के लिए प्रयास करता है। Date.valueOf()रूपांतरण के लिए प्रयोग किया जाता है (जो उसी चीज़ को लौटाता है Date.getTime()
सलमान ए

13
@WouterHuysentruit दोनों बहुत तेज हैं (> सबसे धीमी ब्राउज़र में 3 लाख OPS)। आपके द्वारा
सोची

13
ध्यान दें कि '=' में शामिल कुछ भी आपके उत्तर के '+' उपसर्ग भाग का उपयोग करना चाहिए , गलत है। <, <=, >और >=एक ही एल्गोरिथ्म (का उपयोग सार रिलेशनल तुलना एल्गोरिथ्म ) पर्दे के पीछे।
सलमान ए

2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… आपके उत्तर के लिए धन्यवाद, जिस सेवा में मैं काम कर रहा हूं उसमें एक भयानक बग था जिसे ट्रैक करना मुश्किल था।
गुय्यों ली

157

< <= > >=जावास्क्रिप्ट तिथियों की तुलना करने के लिए रिलेशनल ऑपरेटरों का उपयोग किया जा सकता है:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

हालांकि, समानता ऑपरेटरों == != === !==की तुलना करने के (का मूल्य) दिनांक नहीं किया जा सकता क्योंकि :

  • दो अलग-अलग वस्तुएं सख्त या अमूर्त तुलनाओं के लिए कभी भी बराबर नहीं होती हैं।
  • ऑब्जेक्ट्स की तुलना करने वाला एक अभिव्यक्ति केवल सच है अगर ऑपरेंड उसी ऑब्जेक्ट का संदर्भ देते हैं।

आप इनमें से किसी भी विधि का उपयोग करके समानता के लिए तारीखों के मूल्य की तुलना कर सकते हैं:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

दोनों Date.getTime()और Date.valueOf()1 जनवरी, 1970, 00:00 यूटीसी के बाद मिलीसेकेंड की संख्या लौटने। Numberफंक्शन और यूनीरी +ऑपरेटर दोनों valueOf()ही पर्दे के पीछे के तरीकों को कहते हैं।


क्या स्ट्रिंग को दिनांक ऑब्जेक्ट में बदलना सुरक्षित है? क्या वह अपवाद नहीं फेंक सकता है या अविश्वसनीय परिणाम नहीं दे सकता है? जेएस में कॉमरिंग डेट करने का सबसे विश्वसनीय तरीका क्या हो सकता है? जब आप अविश्वसनीय परिणाम कहते हैं, तो क्या यह विधि भिन्न / गलत मान दे सकती है, जब हम सुनिश्चित होते हैं कि तारीख प्रारूप नहीं बदलेगा -> यह "गुरुवार, 10 अगस्त 2017" होगा। यहां आपकी मदद की बहुत प्रशंसा हुई।
user2696258

क्या यह भिन्न OS / ब्राउज़रों / उपकरणों पर समान दिनांक मान के लिए अविश्वसनीय परिणाम दे सकता है?
user2696258

1
@ user2696258 यह दो दिनांक वस्तुओं की तुलना करने का सबसे विश्वसनीय तरीका है । एक स्ट्रिंग को तिथि पर बदलना एक अलग मुद्दा है ... एक तारीख पार्सिंग लाइब्रेरी का उपयोग करें या अपना स्वयं का समाधान रोल करें। Thursday, 10 Aug 2017गैर-मानक प्रारूप है और विभिन्न ब्राउज़र इसे अलग तरीके से पार्स कर सकते हैं, या इसे बिल्कुल भी पार्स नहीं कर सकते। पर नोट देखें Date.parse
सलमान ए

88

अब तक की सबसे आसान विधि है एक तिथि को दूसरे से घटाना और परिणाम की तुलना करना।

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);


68

जावास्क्रिप्ट में तारीखों की तुलना करना काफी आसान है ... जावास्क्रिप्ट में अंतर्निहित तारीखों के लिए तुलनात्मक प्रणाली है जो तुलना करना इतना आसान बनाता है ...

2 तारीख मूल्य की तुलना करने के लिए बस इन चरणों का पालन करें, उदाहरण के लिए आपके पास 2 इनपुट हैं जिनमें से प्रत्येक में दिनांक मान है Stringऔर आप उनकी तुलना करने के लिए ...

1. आपके पास एक इनपुट से मिलने वाले 2 स्ट्रिंग मान हैं और आप उनकी तुलना करना चाहेंगे, वे नीचे दिए गए हैं:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. उन्हें Date Objectदिनांक मानों के रूप में तुलना करने की आवश्यकता है , इसलिए बस उन्हें तारीख में परिवर्तित करें, उपयोग करते हुए new Date(), मैं उन्हें स्पष्टीकरण की सादगी के लिए फिर से असाइन करता हूं, लेकिन आप इसे वैसे भी कर सकते हैं:

date1 = new Date(date1);
date2 = new Date(date2);

3. अब बस उनकी तुलना करें, का उपयोग करते हुए> < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

जावास्क्रिप्ट में तारीखों की तुलना करें


मैंने पाया कि किसी भी ब्राउज़र में तारीखों की तुलना करने के लिए अधिकांश समाधान काम करते हैं। मैं जिस मुद्दे का अनुभव करता था वह IE के साथ था। इस समाधान ने बोर्ड भर में काम किया। Thx Alireza!
जोशुआ ओगल्सबी

2
यह काम नहीं करता है। और यह काम नहीं करना चाहिए। आप दिनांक ऑब्जेक्ट की तुलना कर रहे हैं।
मैक्सिमम

3
@maxisam नहीं, यह क्योंकि तुलना ऑपरेटरों का काम करता है ( <, >, <=, >=) का इस्तेमाल किया जा रहा है, दिनांक वस्तुओं यूनिक्स काल (सेकंड) करने के लिए पहले बदल दिया जाता है, और यह ठीक काम करता है। हालाँकि ऐसा करने की सामान्य गलती हो सकती है date1 == date2जहाँ वास्तव में एक त्रुटि पेश की जाती है न कि मूल्य के रूप में लेकिन उदाहरण समानता की जाँच की जाती है। इसे रोकने के लिए और दिनांक मान की समानता के लिए जाँच करें यह काम करेगा: date1.valueOf() == date2.valueOf()या उससे कमdate1+0 == date2+0
humanityANDpeace

से नोट MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies. और Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
एएए

35

केवल दिन की तुलना करें (समय घटक की अनदेखी):

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

उपयोग:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}

यह अच्छा है। लेकिन क्या होगा अगर मैं अगले या पिछले दिनों की तुलना करूं मैंने यह तिथि आज़माई। Date.prototyp.nextDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototyp.prepretDay = function (d) {यह वापस करें ।getFullYear () === d.getFullYear () और& this.getDate ()> d.getDate () और + this.getMonth () === d.getMonth (); } लेकिन यह केवल इस महीने में ही काम करेगा। मैं महीने भर में या वर्षों में कैसे तुलना करूँ
Paresh3489227

32

क्या प्रारूप?

यदि आप एक जावास्क्रिप्ट दिनांक ऑब्जेक्ट का निर्माण करते हैं , तो आप मिलिसेकंड अंतर प्राप्त करने के लिए उन्हें घटा सकते हैं (संपादित करें: या बस उन्हें देखें):

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true

1
घटाना एक अच्छा विचार है क्योंकि यह ==ऊपर वर्णित तुलनात्मक समस्या से बचा जाता है।
devios1

क्या आप जावास्क्रिप्ट का उपयोग कर रहे हैं?
हाईड

JSDB - jsdb.org देखें - मैं इन दिनों इसका कम ही उपयोग करता हूं कि अब पायथन मेरी पसंद की भाषा है, लेकिन यह अभी भी एक महान उपयोगिता है।
जेसन एस

1
@ StuartP.Bentley मुझे नहीं पता, क्योंकि मैं उनमें से किसी का उपयोग नहीं करता। मैं jsdb का उपयोग करता हूं।
जेसन एस

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

16

आप इस कोड का उपयोग करते हैं,

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

और इस लिंक को भी देखें http://www.w3schools.com/js/js_obj_date.asp


3
W3Schools: w3fools.com का संदर्भ नहीं देने का एक कारण - अच्छा समाधान हालांकि - क्या यह मानकों का अनुपालन है, और क्या यह सभी ब्राउज़रों में काम करता है?
मथियास लिकेगार्ड लोरेंजेन

1
मोज़िला डेवलपर नेटवर्क का बेहतर संदर्भ: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
डैनियल लिडस्ट्रॉम

16

संक्षिप्त जवाब

यहाँ एक फ़ंक्शन है जो {boolean} को लौटाता है अगर डेटटाइम से> डेटाइम डेमो से एक्शन में

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

व्याख्या

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

चूँकि अब आप दोनों प्रकार की संख्या में डेटाइम कर रहे हैं, आप उनकी तुलना किसी भी तुलनात्मक ऑपरेशन से कर सकते हैं

(>, <, =; =; ==, =; ==,> = और <=)

फिर

यदि आप C#कस्टम दिनांक और समय प्रारूप से परिचित हैं, तो इस लाइब्रेरी को सटीक एक ही कार्य करना चाहिए और आपको अपनी तिथि और समय dmmM प्रारूपित करने में सहायता करना चाहिए करने में चाहे आप दिनांक समय स्ट्रिंग या यूनिक्स प्रारूप में पास कर रहे हों या नहीं

प्रयोग

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

डेमो

आपको बस इतना करना है कि लाइब्रेरी jsफ़ाइल में इनमें से किसी भी प्रारूप को शांत किया जाए


new Date (dtmfrom)> = new Date (dtmto) नई Date (dtmfrom) .getTime ()> = new Date (dtmto) .getTime ()
Gabriel

शायद, लेकिन अंतर लगभग 30 से 120 नैनोसेकंड ( मान लीजिए 0.000000075 सेकंड) प्रति ऑपरेशन है, जो ब्राउज़र पर निर्भर करता है, इसलिए यह वास्तव में महत्वपूर्ण है।
23


14

नोट - केवल दिनांक भाग की तुलना करें:

जब हम जावास्क्रिप्ट में दो तारीख की तुलना करते हैं। यह घंटे, मिनट और सेकंड भी ध्यान में रखता है .. इसलिए अगर हमें केवल तारीख की तुलना करने की आवश्यकता है, तो यह दृष्टिकोण है:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

अब: if date1.valueOf()> date2.valueOf()एक आकर्षण की तरह काम करेगा।


13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

1
वे किस प्रकार के हैं या बी? खजूर? क्या प्रारूप? यह मेरे साथ काम करने के लिए नहीं लगता है।
लुसी

5
आप abDatereturn a*1 == b*1;
जिन

4
@ यूडीजी: कम:+a == +b
मपेन

13
var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates

11

बस कई मौजूदा विकल्पों में एक और संभावना जोड़ने के लिए, आप कोशिश कर सकते हैं:

if (date1.valueOf()==date2.valueOf()) .....

... जो मेरे लिए काम करने लगता है। बेशक आपको यह सुनिश्चित करना होगा कि दोनों तिथियां अपरिभाषित न हों ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

इस तरह हम यह सुनिश्चित कर सकते हैं कि अगर दोनों अपरिभाषित हैं, या एक सकारात्मक तुलना की जाती है ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... यदि आप उन्हें पसंद करते हैं तो समान नहीं हैं।


11

वाया Moment.js

Jsfiddle: http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

विधि 1 dateTimeAसे अधिक होने पर वापस आती हैdateTimeB

यदि dateTimeAसमान हो तो विधि 0 देता हैdateTimeB

विधि -1 dateTimeAसे कम होने पर वापस आती हैdateTimeB


3
Dateवस्तुओं के लिए तारीख की तुलना करने के लिए किसी बाहरी पुस्तकालय जैसे मोमेंट का उपयोग करने की आवश्यकता नहीं है ।
AMB

मेरे उपयोग के मामले के लिए क्षण बिल्कुल आवश्यक था। धन्यवाद, रज़ान!
razorsyntax

1
क्यों तुम भी उपयोग कर रहे हैं <या >ऑपरेटरों पल पहले से ही इस तरह के रूप में काम तुलना तरीकों के साथ आता है जब .isBeforeऔर .isAfter, उस में सब है डॉक्स
Svarog

10

TIMEZONE से सावधान रहें

एक जावास्क्रिप्ट तिथि में समयक्षेत्र की कोई धारणा नहीं है । यह "स्थानीय" टाइमज़ोन में और स्ट्रिंग्स से अनुवाद करने के लिए आसान कार्यों के साथ समय में एक क्षण है (युग के बाद से टिक)। यदि आप दिनांक ऑब्जेक्ट्स का उपयोग करते हुए तारीखों के साथ काम करना चाहते हैं, जैसा कि यहां हर कोई कर रहा है, तो आप चाहते हैं कि आपकी तिथियां UTC का प्रतिनिधित्व करने के लिए मध्यरात्रि में प्रारंभ दिनांक पर करें। यह एक आम और आवश्यक सम्मेलन है जो आपको उनकी रचना के मौसम या समयक्षेत्र की परवाह किए बिना तारीखों के साथ काम करने देता है। इसलिए आपको समय-सीमा की धारणा को प्रबंधित करने के लिए बहुत सतर्क रहने की आवश्यकता है, खासकर जब आप अपनी मध्यरात्रि यूटीसी तिथि वस्तु बनाते हैं।

अधिकांश समय, आप चाहते हैं कि आपकी तिथि उपयोगकर्ता के समय क्षेत्र को प्रतिबिंबित करे। अगर आपका जन्मदिन है तो क्लिक करें । NZ और US के उपयोगकर्ता एक ही समय पर क्लिक करते हैं और अलग-अलग दिनांक प्राप्त करते हैं। उस मामले में, यह करें ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

कभी-कभी, अंतर्राष्ट्रीय तुलनीयता स्थानीय सटीकता को प्रभावित करती है। उस मामले में, यह करें ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

अब आप सीधे अपनी तिथि वस्तुओं की तुलना कर सकते हैं क्योंकि अन्य उत्तर सुझाते हैं।

जब आप बनाते समय टाइमज़ोन का प्रबंधन करने के लिए ध्यान रखा जाता है, तो आपको एक स्ट्रिंग प्रतिनिधित्व में वापस बदलने के लिए टाइमज़ोन को बाहर रखना सुनिश्चित करना होगा। तो आप सुरक्षित रूप से उपयोग कर सकते हैं ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

और पूरी तरह से बाकी सब से बचें, खासकर ...

  • getYear(), getMonth(),getDate()

8

मान लें कि आपको तारीखें ए और बी मिलीं, उनका ईपीओसी समय मूल्य प्राप्त करें, फिर मिलीसेकंड में अंतर प्राप्त करने के लिए घटाएं।

var diff = +A - +B;

बस इतना ही।


8

दो तारीखों की तुलना करने के लिए हम date.js जावास्क्रिप्ट लाइब्रेरी का उपयोग कर सकते हैं जो कि यहां पाई जा सकती हैं: https://code.google.com/archive/p/datejs/downloads

और Date.compare( Date date1, Date date2 )विधि का उपयोग करें और यह एक संख्या लौटाता है जिसका अर्थ निम्न परिणाम है:

-1 = तारीख 1 है लिस्टथान तारीख 2।

0 = मान बराबर हैं।

1 = तारीख 1 अधिकरण तारीख 2 है।


8

दो तारीख घटाएँ मिलिसेकंड में अंतर मिलता है, अगर आपको 0वही तारीख मिलती है

function areSameDate(d1, d2){
    return d1 - d2 === 0
}

7

जावास्क्रिप्ट में मुफ्त पाठ से तारीखें बनाने के लिए आपको इसे दिनांक () ऑब्जेक्ट में पार्स करने की आवश्यकता है।

आप Date.parse () का उपयोग कर सकते हैं जो मुफ्त पाठ लेता है इसे एक नई तारीख में बदलने की कोशिश करता है, लेकिन यदि आपके पास पृष्ठ पर नियंत्रण है तो मैं इसके बजाय HTML चयन बॉक्स या YUI कैलेंडर नियंत्रण या jQuery UI जैसे एक तिथि पिकर का उपयोग करने की सिफारिश करूंगा खजूर

एक बार जब आपके पास एक तारीख होती है, जैसा कि अन्य लोगों ने बताया है कि आप तिथियों को घटाने के लिए सरल अंकगणित का उपयोग कर सकते हैं और एक दिन में सेकंड की संख्या से संख्या (सेकंड में) को विभाजित करके इसे कई दिनों में बदल सकते हैं (60 * 60 * 24 = 86400)।


6
var date_today=new Date();
var formated_date = formatDate(date_today);//Calling formatDate Function

var input_date="2015/04/22 11:12 AM";

var currentDateTime = new Date(Date.parse(formated_date));
var inputDateTime   = new Date(Date.parse(input_date));

if (inputDateTime <= currentDateTime){
    //Do something...
}

function formatDate(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    hours   = hours < 10 ? '0'+hours : hours ;

    minutes = minutes < 10 ? '0'+minutes : minutes;

    var strTime = hours+":"+minutes+ ' ' + ampm;
    return  date.getFullYear()+ "/" + ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) :
    (date.getMonth()+1) ) + "/" + (date.getDate() < 10 ? "0"+date.getDate() :
    date.getDate()) + " " + strTime;
}

5

"कुछ" द्वारा पोस्ट किए गए कोड का एक बेहतर संस्करण

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

उपयोग:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));

मुमकिन है एक तारीख उदाहरण है जिस पर विधि कहा जाता है। जो मामले में कर सकते हैं एक एक अमान्य दिनांक हो, लेकिन अभी भी एक तिथि उदाहरण हो सकता है?
रॉबग

5

यदि आपका दिनांक प्रारूप निम्नलिखित है, तो आप इस कोड का उपयोग कर सकते हैं:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

यह जांच करेगा कि 20121121संख्या बड़ी है 20121103या नहीं।


4
यदि यह पहले से ही ISO8601 प्रारूप (YYYY-MM-DD) में है, तो आपको किसी भी वर्ण को हटाने या इसे पूर्णांक में बदलने की आवश्यकता नहीं है। बस तार first == secondया first < secondया की तुलना करें first > second। MM86 / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM या MM / YY / DD की तुलना में ISO8601 के साथ कई सुंदरियों में से एक है।
कुछ

5

मैं आमतौर पर डेटाबेस में स्टोर Datesकरता हूं timestamps(Number)

जब मुझे तुलना करने की आवश्यकता होती है, मैं बस उन टाइमस्टैम्प्स के बीच तुलना करता हूं या

इसे दिनांक ऑब्जेक्ट में कनवर्ट करें और > <यदि आवश्यक हो तो तुलना करें ।

ध्यान दें कि == या === ठीक से काम नहीं करता है जब तक कि आपके चर समान दिनांक ऑब्जेक्ट के संदर्भ नहीं हैं।

उन तारीख वस्तुओं को पहले टाइमस्टैम्प (संख्या) में परिवर्तित करें और फिर उनकी समानता की तुलना करें।


टाइमस्टैम्प के लिए दिनांक

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp

टाइमस्टैंप टू डेट

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);

यह सबसे अच्छा उत्तर है - और सबसे तेज jsperf.com/comparing-date-objects
स्कॉट स्टेंसलैंड

3

Datesऑब्जेक्ट की तुलना करने से पहले , अपने दोनों मिलिसेकंड को शून्य की तरह सेट करने का प्रयास करें Date.setMilliseconds(0);

कुछ मामलों में जहां Dateवस्तु को गतिशील रूप से जावास्क्रिप्ट में बनाया जाता है, यदि आप मुद्रण करते रहते हैं Date.getTime(), तो आपको मिलीसेकंड बदलते हुए दिखाई देंगे, जो दोनों तिथियों की समानता को रोक देगा।


3

प्रदर्शन

आज 2020.02.27 मैं MacOs हाई सिएरा v10.13.6 पर क्रोम v80.0, सफारी v13.0.5 और फ़ायरफ़ॉक्स 73.0.1 पर चुने हुए समाधानों का परीक्षण करता हूं।

निष्कर्ष

  • समाधान d1==d2(D) और d1===d2(E) सभी ब्राउज़रों के लिए सबसे तेज़ हैं
  • समाधान getTime(ए) valueOf(बी) से तेज है (दोनों मध्यम तेज हैं)
  • समाधान F, L, N सभी ब्राउज़रों के लिए सबसे धीमे हैं

यहां छवि विवरण दर्ज करें

विवरण

नीचे दिए गए स्निपेट में प्रदर्शन परीक्षण में उपयोग किए गए समाधान प्रस्तुत किए गए हैं। आप यहाँ मशीन में परीक्षण कर सकते हैं

क्रोम के लिए परिणाम

यहां छवि विवरण दर्ज करें


लेकिन d1==d2या d1===d2प्रश्न के संदर्भ में बेकार है।
द मैस्टर

1
        from_date ='10-07-2012';
        to_date = '05-05-2012';
        var fromdate = from_date.split('-');
        from_date = new Date();
        from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]);
        var todate = to_date.split('-');
        to_date = new Date();
        to_date.setFullYear(todate[2],todate[1]-1,todate[0]);
        if (from_date > to_date ) 
        {
            alert("Invalid Date Range!\nStart Date cannot be after End Date!")

            return false;
        }

जावास्क्रिप्ट का उपयोग करके दिनांक की तुलना करने के लिए इस कोड का उपयोग करें।

धन्यवाद डी। जीव


मुझे लगता है कि यह एक अच्छा जवाब है क्योंकि हमारे पास "dd / mm / yy" प्रारूप है और हमें दोनों तिथियों की तुलना करने के लिए ऐसा करना होगा। मुझे नहीं पता कि यह सबसे अच्छा जवाब है लेकिन यह पर्याप्त है। शेयर करने के लिए धन्यवाद।
डेनिगोनलिनिया

1
var curDate=new Date();
var startDate=document.forms[0].m_strStartDate;

var endDate=document.forms[0].m_strEndDate;
var startDateVal=startDate.value.split('-');
var endDateVal=endDate.value.split('-');
var firstDate=new Date();
firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]);

var secondDate=new Date();
secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]);
if(firstDate > curDate) {
    alert("Start date cannot be greater than current date!");
    return false;
}
if (firstDate > secondDate) {
    alert("Start date cannot be greater!");
    return false;
}

1

यहाँ मैंने अपनी एक परियोजना में क्या किया है,

function CompareDate(tform){
     var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10));
     var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10));

     if(tform.START_DATE.value!=""){
         var estStartDate = tform.START_DATE.value;
         //format for Oracle
         tform.START_DATE.value = estStartDate + " 00:00:00";
     }

     if(tform.END_DATE.value!=""){
         var estEndDate = tform.END_DATE.value;
         //format for Oracle
         tform.END_DATE.value = estEndDate + " 00:00:00";
     }

     if(endDate <= startDate){
         alert("End date cannot be smaller than or equal to Start date, please review you selection.");
         tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10);
         tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10);
         return false;
     }
}

फॉर्म ऑनसुबमिट पर इसे कॉल करना। उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.