केवल जावास्क्रिप्ट में समय की तुलना के बिना तारीख भाग की तुलना करना


397

नीचे दिए गए कोड में क्या गलत है?

शायद यह सिर्फ तारीख और समय की तुलना करने के लिए सरल होगा। मुझे यकीन नहीं है कि यह कैसे करना है, और मैंने खोज की, लेकिन मुझे अपनी सटीक समस्या नहीं मिली।

BTW, जब मैं दो तिथियों को एक चेतावनी में प्रदर्शित करता हूं, तो वे बिल्कुल वैसा ही दिखाते हैं।

मेरा कोड:

window.addEvent('domready', function() {
    var now = new Date();
    var input = $('datum').getValue();
    var dateArray = input.split('/');
    var userMonth = parseInt(dateArray[1])-1;
    var userDate = new Date();
    userDate.setFullYear(dateArray[2], userMonth, dateArray[0], now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());

    if (userDate > now)
    {
        alert(now + '\n' + userDate);
    }
});

क्या तिथियों की तुलना करने का एक सरल तरीका है और समय सहित नहीं?

जवाबों:


781

मैं अभी भी जावास्क्रिप्ट सीख रहा हूं, और एकमात्र तरीका जो मैंने पाया है जो मेरे लिए बिना समय के दो तिथियों की तुलना करने के लिए काम करता setHoursहै, दिनांक ऑब्जेक्ट की विधि का उपयोग करना और घंटे, मिनट, सेकंड और मिलीसेकंड को शून्य पर सेट करना है। फिर दोनों तिथियों की तुलना करें।

उदाहरण के लिए,

date1 = new Date()
date2 = new Date(2011,8,20)

date2घंटे, मिनट, सेकंड और मिलीसेकंड के साथ शून्य पर सेट किया जाएगा, लेकिन तारीख 1 ने उन्हें उस समय पर सेट किया होगा, जब तारीख 1 बनाई गई थी। दिनांक 1 पर घंटे, मिनट, सेकंड और मिलीसेकंड से छुटकारा पाने के लिए निम्न कार्य करें:

date1.setHours(0,0,0,0)

अब आप समय के बारे में चिंता किए बिना केवल दिनांक के रूप में दो तिथियों की तुलना कर सकते हैं।


63
कृपया ध्यान रखें कि परीक्षण date1 === date2लगातार व्यवहार प्रदान नहीं करता है; यह करना date1.valueOf() === b.valueOf()या करना भी बेहतर है date1.getTime() === date2.getTime()। विचित्रता।
इरविन वेसल्स

4
सावधान रहें: यदि तारीख 1 और तारीख 2 सर्दियों और गर्मियों में हैं, और आप एडडेज़ (1) के साथ एक से दूसरे तक पुनरावृति की योजना बनाते हैं, तो समस्या यह है कि दिन के उजाले की बचत के कारण उनके पास एक ही समयक्षेत्र नहीं होगा, इसलिए अंतिम तुलना करें कि समान तारीखें देनी चाहिए, काम नहीं करेगा क्योंकि दो तारीखें वास्तव में 00: 00: 00: 0 नहीं हैं।
ओलिवर

9
मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन खोज करते समय यह Google में सबसे पहले आता है। इस उत्तर के साथ सावधान रहें। यह गलत उत्तर देगा यदि उपयोगकर्ता उसी समय क्षेत्र में नहीं है जो दिनांक ऑब्जेक्ट के निर्माता के रूप में है। उदाहरण के लिए, अपने कंप्यूटर के OS पर ईस्ट कोस्ट (यूएस) के समय के समय को बदलें। अपने ब्राउज़र का कंसोल खोलें और टाइप करें var date2 = new Date(2011,8,20)। अब OS के टाइम ज़ोन को Pacific Time (US) में बदलें। उसी ब्राउज़र कंसोल में टाइप करें date2.toDateString()और आप Mon Sep 19 201120 वें मंगलवार की बजाय वापस आ जाएंगे !
एडम

9
यह भी ध्यान दें कि setHours()वर्तमान टाइमज़ोन पर आधारित समय सेट करता है, जो स्वचालित रूप से ब्राउज़र द्वारा पता लगाया जाता है। कोशिश करें: t = new Date("2016-02-29T01:45:49.098Z"); t.setHours(0,0,0,0); console.log(t.toJSON());प्रिंट करेंगे "2016-02-28T15:00:00.000Z", दिनांक 28, लेकिन 29 नहीं मेरा वर्तमान समय क्षेत्र हैAsia/Tokyo
स्थानांतरित करें

8
इस उत्तर को वास्तव setUTCxxxमें स्थानीय / समय क्षेत्र के बारे में जानने के लिए अद्यतन किया जाना चाहिए ।
स्टिजन डे विट

136

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

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

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

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

Deserializing (या मध्यरात्रि 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.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()));

एक तिथि का वर्णन करें

अक्सर तार पर तारीखें YYYY-MM-DD प्रारूप में होंगी। उन्हें deserialize करने के लिए, ऐसा करें ...

var midnightUTCDate = new Date( dateString + 'T00:00:00Z');

serializing

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

  • 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()

तो आपके सवाल का जवाब देने के लिए 7 साल बहुत देर ...

<input type="date" onchange="isInPast(event)">
<script>
var isInPast = function(event){
  var userEntered = new Date(event.target.valueAsNumber); // valueAsNumber has no time or timezone!
  var now = new Date();
  var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ));
  if(userEntered.getTime() < today.getTime())
    alert("date is past");
  else if(userEntered.getTime() == today.getTime())
    alert("date is today");
  else
    alert("date is future");

}
</script>

इसे चलाकर देखें ...

अपडेट 2019 ... मुफ्त सामान ...

इस उत्तर की लोकप्रियता को देखते हुए, मैंने यह सब कोड में डाल दिया है। निम्न फ़ंक्शन एक लिपटे दिनांक ऑब्जेक्ट लौटाता है, और केवल उन कार्यों को उजागर करता है जो बस-ए-डेट ™ के साथ उपयोग करने के लिए सुरक्षित हैं।

इसे दिनांक ऑब्जेक्ट के साथ कॉल करें और यह उपयोगकर्ता के समय क्षेत्र को दर्शाते हुए जस्टडेट को हल करेगा। इसे एक स्ट्रिंग के साथ कॉल करें: यदि स्ट्रिंग एक आईएसओ 8601 है जिसमें टाइमज़ोन निर्दिष्ट है, तो हम केवल समय भाग को राउंड ऑफ करेंगे। यदि टाइमज़ोन निर्दिष्ट नहीं है, तो हम इसे स्थानीय टाइमज़ोन को दर्शाने वाली तिथि में परिवर्तित कर देंगे, जैसे कि तारीख वस्तुओं के लिए।

function JustADate(initDate){
  var utcMidnightDateObj = null
  // if no date supplied, use Now.
  if(!initDate)
    initDate = new Date();

  // if initDate specifies a timezone offset, or is already UTC, just keep the date part, reflecting the date _in that timezone_
  if(typeof initDate === "string" && initDate.match(/((\+|-)\d{2}:\d{2}|Z)$/gm)){  
     utcMidnightDateObj = new Date( initDate.substring(0,10) + 'T00:00:00Z');
  } else {
    // if init date is not already a date object, feed it to the date constructor.
    if(!(initDate instanceof Date))
      initDate = new Date(initDate);
      // Vital Step! Strip time part. Create UTC midnight dateObj according to local timezone.
      utcMidnightDateObj = new Date(Date.UTC(initDate.getFullYear(),initDate.getMonth(), initDate.getDate()));
  }

  return {
    toISOString:()=>utcMidnightDateObj.toISOString(),
    getUTCDate:()=>utcMidnightDateObj.getUTCDate(),
    getUTCDay:()=>utcMidnightDateObj.getUTCDay(),
    getUTCFullYear:()=>utcMidnightDateObj.getUTCFullYear(),
    getUTCMonth:()=>utcMidnightDateObj.getUTCMonth(),
    setUTCDate:(arg)=>utcMidnightDateObj.setUTCDate(arg),
    setUTCFullYear:(arg)=>utcMidnightDateObj.setUTCFullYear(arg),
    setUTCMonth:(arg)=>utcMidnightDateObj.setUTCMonth(arg),
    addDays:(days)=>{
      utcMidnightDateObj.setUTCDate(utcMidnightDateObj.getUTCDate + days)
    },
    toString:()=>utcMidnightDateObj.toString(),
    toLocaleDateString:(locale,options)=>{
      options = options || {};
      options.timezone = "UTC";
      locale = locale || "en-EN";
      return utcMidnightDateObj.toLocaleDateString(locale,options)
    }
  }
}


// if initDate already has a timezone, we'll just use the date part directly
console.log(JustADate('1963-11-22T12:30:00-06:00').toLocaleDateString())


3
आपके उत्तर में वास्तव में मूल्यवान जानकारी है! दुर्भाग्यवश आपने वास्तव में ओपी के वास्तविक प्रश्न का उत्तर नहीं जोड़ा, मुझे इसे रोकने से रोका। एक छोटे से कोड स्निपेट में जोड़ने का प्रयास करें जो ओपी के प्रश्न का उत्तर देता है।
स्टिजन डे विट

हा हा हा @ '7 साल बहुत देर'! मुझे आपकी शैली user1585345 पसंद है! आपको मेरा वोट मिल गया!
स्टिजन डे विट

मुझे यह मददगार लगा। ध्यान दें कि "अंतर्राष्ट्रीय तुलनात्मकता" स्निपेट में एक टाइपो है। मुझे लगता है कि यह होना चाहिए: नई तिथि (Date.UTC (myDate.getUTCFullYear)), myDate.getUTCMonth (), myDate.getUTCDate ());
RikRak

1
काश मैं इस उत्तर को 100 बार और बढ़ा पाता !!!
Sain 18:ошƒаӽ

77

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

Date.prototype.withoutTime = function () {
    var d = new Date(this);
    d.setHours(0, 0, 0, 0);
    return d;
}

यह आपको अपने चर के मूल्य को प्रभावित किए बिना तारीख की तारीख के हिस्से की तुलना करने की अनुमति देता है:

var date1 = new Date(2014,1,1);
new Date().withoutTime() > date1.withoutTime(); // true

यह अब तक मूल पोस्ट का सबसे सुरुचिपूर्ण उत्तर है। मैंने अपने उद्देश्यों के लिए एक अलग फ़ंक्शन नहीं बनाया, बस कोड की दो पंक्तियों को शामिल किया।
डेनियल रीक्स

25

Moment.js का उपयोग करना

यदि आपके पास तृतीय-पक्ष लाइब्रेरी शामिल करने का विकल्प है, तो यह निश्चित रूप से Moment.js पर एक नज़र डालने के लायक है । यह काम करता है Dateऔर DateTimeबहुत आसान है।

उदाहरण के लिए, यह देखना कि क्या एक तारीख दूसरी तारीख के बाद आती है, लेकिन उनके समय को छोड़कर, आप कुछ इस तरह करेंगे:

var date1 = new Date(2016,9,20,12,0,0); // October 20, 2016 12:00:00
var date2 = new Date(2016,9,20,12,1,0); // October 20, 2016 12:01:00

// Comparison including time.
moment(date2).isAfter(date1); // => true

// Comparison excluding time.
moment(date2).isAfter(date1, 'day'); // => false

दूसरा पैरामीटर आप में पारित isAfterतुलना करने के लिए सटीक है और कोई भी हो सकता year, month, week, day, hour, minuteया second


4
100x स्पीडअप को गति के समाधान से एक दिनांक () + सेटहोर्स समाधान तक ले जाया गया। सावधान दोस्तों :-)
2c2c

@ 2 सी 2 सी दिलचस्प। प्रदर्शन प्रभाव को जानने के लिए निश्चित रूप से अच्छा है। आपने अपने बेंचमार्क के लिए कितने ऑपरेशन किए?
जोशुआ पिंटर

1
मैं लगभग 1mil तुलना में था। फ्लॉप सेटअप वास्तविक बेंचमार्क
2c2c

17

बस नीचे की तरह .toDateString का उपयोग करके तुलना करें:

new Date().toDateString();

यह आपको केवल तारीख का हिस्सा लौटाएगा, समय या समय-सीमा नहीं, जैसे:

"शुक्र फरवरी 03 2017"

इसलिए दोनों तारीखों की तुलना इस प्रारूप में की जा सकती है।


2
यह एक अच्छी शुरुआत है, लेकिन यह तुलना के लिए अनुमति नहीं देगा क्योंकि यह अब एक स्ट्रिंग है। तुलना करने के लिए, इसे वापस करके दिनांक ऑब्जेक्ट पर बदलें new Date(new Date().toDateString());
ग्रिड ट्रेककोर

@GridTrekkor सच है, लेकिन अगर आप एक त्वरित समानता परीक्षण चाहते हैं तो यह सबसे सरल समाधान है।
सीएम

8

यह थोड़ा क्लीनर संस्करण हो सकता है, यह भी ध्यान दें कि आपको पार्सइंट का उपयोग करते समय हमेशा एक मूलांक का उपयोग करना चाहिए।

window.addEvent('domready', function() {
    // Create a Date object set to midnight on today's date
    var today = new Date((new Date()).setHours(0, 0, 0, 0)),
    input = $('datum').getValue(),
    dateArray = input.split('/'),
    // Always specify a radix with parseInt(), setting the radix to 10 ensures that
    // the number is interpreted as a decimal.  It is particularly important with
    // dates, if the user had entered '09' for the month and you don't use a
    // radix '09' is interpreted as an octal number and parseInt would return 0, not 9!
    userMonth = parseInt(dateArray[1], 10) - 1,
    // Create a Date object set to midnight on the day the user specified
    userDate = new Date(dateArray[2], userMonth, dateArray[0], 0, 0, 0, 0);

    // Convert date objects to milliseconds and compare
    if(userDate.getTime() > today.getTime())
    {
            alert(today+'\n'+userDate);
    }
});

मूलांक के बारे में अधिक जानकारी के लिए MDC parseInt पृष्ठ देखें।

जेएसएलआईएनटी एक लापता मूलांक और कई अन्य चीजों को पकड़ने के लिए एक महान उपकरण है जो त्रुटियों को अस्पष्ट और कठिन बना सकता है। यह आपको बेहतर कोडिंग मानकों का उपयोग करने के लिए मजबूर करता है ताकि आप भविष्य के सिरदर्द से बच सकें। मैं इसे हर जावास्क्रिप्ट प्रोजेक्ट I कोड पर उपयोग करता हूं।


@EmKay यह अब एक मुद्दे के रूप में बड़ा नहीं होना चाहिए क्योंकि ES5 अधिकांश ब्राउज़रों में काफी मानक है और यह अष्टक व्याख्या की मनाही करता है लेकिन कुछ ब्राउज़र अभी भी पीछे की संगतता कारणों के लिए पुरानी अष्टक व्याख्या का उपयोग कर रहे हैं, इसलिए मैं एक मूलांक का उपयोग करूंगा। निकट भविष्य के लिए।
बेकार कोड

यदि आप सख्त मोड का उपयोग करते हैं तो ऑक्टिकल व्याख्याएं त्रुटियों को फेंक देगी, जो एक अच्छी बात है क्योंकि यह आपको गलतियां ढूंढने में मदद करता है जो गलत तरीके से व्याख्या की जा सकती हैं।
बेकार कोड

4

Date.js पुस्तकालय इन बातों के लिए आसान है। यह सभी जेएस तारीख से संबंधित विभाजन को बहुत आसान बनाता है।


11
क्या आप इस बारे में अधिक जानकारी जोड़ सकते हैं कि यह लाइब्रेरी कैसे आसान बनाती है?
महमूद हनफ़ी

4

यदि आप वास्तव में केवल समय घटक के साथ तारीख की तुलना कर रहे हैं, तो एक और समाधान जो गलत लग सकता है लेकिन काम करता है और हर Date()समय और समय से बचता है, यह है कि स्ट्रिंग की तुलना में सीधे आईएसओ स्ट्रिंग तिथि की तुलना करना है:

> "2019-04-22" <= "2019-04-23"
true
> "2019-04-22" <= "2019-04-22"
true
> "2019-04-22" <= "2019-04-21"
false
> "2019-04-22" === "2019-04-22"
true

आप वर्तमान तिथि (यूटीसी तिथि, उपयोगकर्ता की स्थानीय तारीख को नहीं) का उपयोग करके प्राप्त कर सकते हैं:

> new Date().toISOString().split("T")[0]
"2019-04-22"

इसके पक्ष में मेरा तर्क प्रोग्रामर सादगी है - आप इसे कम करने की कोशिश कर रहे हैं कि डेटेटाइम और ऑफ़सेट को सही ढंग से संभालने की कोशिश कर रहे हैं, शायद गति की कीमत पर (मैंने प्रदर्शन की तुलना नहीं की है)


आप यह भी कर सकते हैं new Date().toISOString().substr(0, 10) // "2019-04-22"
पेटी

स्थानीय तिथि (गैर-यूटीसी तिथि) के लिए आप उपयोग कर सकते हैं new Date().toLocaleDateString() // "8/26/2019"। लेकिन तब पाठ की तुलना करना सटीक नहीं होगा (जैसे "8/26/2019" >= "9/29/2001"कि गलत है)। तो आपको इसे new Date(new Date().toLocaleDateString())किसी अन्य दिनांक की तुलना करने के लिए सटीक रूप से परिवर्तित करने की आवश्यकता होगी ।
पेट में

4

बस दोनों तिथियों पर toDateString () का उपयोग करें। .DateString में समय शामिल नहीं है, इसलिए एक ही तिथि पर 2 बार, मान समान होंगे, जैसा कि नीचे दिखाया गया है।

var d1 = new Date(2019,01,01,1,20)
var d2 = new Date(2019,01,01,2,20)
console.log(d1==d2) // false
console.log(d1.toDateString() == d2.toDateString()) // true

जाहिर है कि इस सवाल पर कहीं और व्यक्त की गई समय-सीमा की कुछ चिंताएं वैध हैं, लेकिन कई परिदृश्यों में, जो प्रासंगिक नहीं हैं।


1
मेरे मामले में यह समाधान चयनित उत्तर और अधिक-मतदान उत्तरों से बेहतर है। "स्पष्ट रूप से समय की तुलना किए बिना" शीर्षक में यह स्पष्ट रूप से कहा गया है, यह समाधान वास्तव में ऐसा करता है, जिससे तुलना में हेरफेर करने के लिए समय निर्धारित करने की आवश्यकता बचती है। "क्या ईवेंट एक्स और ईवेंट Y एक ही दिन में होता है" का उत्तर देने के लिए, यह उत्तर देने के बजाय केवल दिनांक की तुलना करने के लिए अधिक समझ में आता है "ईवेंट 00: 00: 00.00 एएम की घटना एक्स की तिथि ठीक 00:00 के साथ समान है: घटना Y की तारीख का 00.00? " जो कि कई अन्य उत्तरदाता कर रहे हैं
Mr.K

3

इस तरह से मैं यह कर रहा हूँ:

var myDate  = new Date($('input[name=frequency_start]').val()).setHours(0,0,0,0);
var today   = new Date().setHours(0,0,0,0);
if(today>myDate){
    jAlert('Please Enter a date in the future','Date Start Error', function(){
        $('input[name=frequency_start]').focus().select();
    });
}

मैं वर्तमान में उत्पादन में इसका उपयोग करता हूं और मेरे पास कोई मुद्दा या ब्राउज़र असंगतता आदि नहीं है ... कोई भी कारण जो आप कह रहे हैं कि getTime()यह आवश्यक है?
फैब्रीज़ियो

5
कृपया ध्यान रखें कि setHours()यह जिस वस्तु को कहा जाता है उसे संशोधित करता है, और दिनांक को कई मिलीसेकंड (कॉलिंग के बराबर getTime()) के रूप में वापस करता है। इसलिए आपका todayवैरिएबल कोई ऐसी Dateवस्तु नहीं है जिसकी कुछ लोग अपेक्षा करते हैं, लेकिन वास्तव में एक पूर्णांक संख्या मिलीसेकंड की होती है। एक साइड-इफ़ेक्ट के रूप में यही कारण है कि आपको getTime()तुलना करने से पहले कॉल करने की आवश्यकता नहीं थी , क्योंकि आपके पास पहले से ही अस्पष्ट तरीके से है।
तीमुथियुस वाल्टर्स

3

जैसा कि मैंने यहां समान दृष्टिकोण नहीं देखा है, और मैं h / m / s / ms को 0 पर सेट करने में आनंद नहीं ले रहा हूं, क्योंकि यह परिवर्तित समय के साथ स्थानीय समय क्षेत्र में सटीक परिवर्तन के साथ समस्या पैदा कर सकता है date(मैं ऐसा मानता हूं), मुझे बताएं यहां पेश करें, कुछ पल पहले लिखा गया, lil फंक्शन:

+: प्रयोग करने में आसान, एक बुनियादी तुलना संचालन करता है (दिन, महीने और साल की तुलना बिना समय के करता है।)
-: ऐसा लगता है कि यह "आउट ऑफ द बॉक्स" सोच के पूर्ण विपरीत है।

function datecompare(date1, sign, date2) {
    var day1 = date1.getDate();
    var mon1 = date1.getMonth();
    var year1 = date1.getFullYear();
    var day2 = date2.getDate();
    var mon2 = date2.getMonth();
    var year2 = date2.getFullYear();
    if (sign === '===') {
        if (day1 === day2 && mon1 === mon2 && year1 === year2) return true;
        else return false;
    }
    else if (sign === '>') {
        if (year1 > year2) return true;
        else if (year1 === year2 && mon1 > mon2) return true;
        else if (year1 === year2 && mon1 === mon2 && day1 > day2) return true;
        else return false;
    }    
}

उपयोग:

datecompare(date1, '===', date2)समानता की जाँच के लिए,
datecompare(date1, '>', date2)अधिक जाँच के लिए,
!datecompare(date1, '>', date2)कम या बराबर जाँच के लिए

इसके अलावा, जाहिर है, आप किसी भी अन्य सरल तुलना को प्राप्त करने के लिए date1और date2स्थानों पर स्विच कर सकते हैं।


एक अच्छा, प्लस प्लस, मुझे बाहर निकालने में मदद करता है, अब उम्मीद है कि आइसो रूपांतरणों को काटने, हाहा, thx नहीं है।
edencorbin

3

तारीखों की तुलना करने का एक कुशल और सही तरीका है:

Math.floor(date1.getTime() / 86400000) > Math.floor(date2.getTime() / 86400000);

यह समय भाग की उपेक्षा करता है, यह अलग-अलग टाइमज़ोन के लिए काम करता है, और आप समानता के लिए ==भी तुलना कर सकते हैं। 86400000 एक दिन में मिलीसेकंड की संख्या है ( = 24*60*60*1000)।

सावधान रहें कि समतुल्य ऑपरेटर का उपयोग डेट ऑब्जेक्ट्स की तुलना करने के लिए कभी नहीं किया ==जाना चाहिए क्योंकि यह तब विफल हो जाता है जब आप काम करने के लिए एक समानता परीक्षण की उम्मीद करेंगे क्योंकि यह दो दिनांक ऑब्जेक्ट्स की तुलना कर रहा है (और दो तिथियों की तुलना नहीं करता है) जैसे:

> date1;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date2;
outputs: Thu Mar 08 2018 00:00:00 GMT+1300

> date1 == date2;
outputs: false

> Math.floor(date1.getTime() / 86400000) == Math.floor(date2.getTime() / 86400000);
outputs: true

नोट्स: यदि आप उन दिनांक ऑब्जेक्ट्स की तुलना कर रहे हैं जिनमें समय भाग शून्य पर सेट है, तो आप उपयोग कर सकते हैं date1.getTime() == date2.getTime()लेकिन यह शायद ही अनुकूलन के लायक है। आप उपयोग कर सकते हैं <, >, <=, या >=तुलना करते समय दिनांक सीधे वस्तुओं क्योंकि इन ऑपरेटरों पहले फोन करके तिथि वस्तु परिवर्तित .valueOf()करने से पहले ऑपरेटर तुलना करता है।


2

इस प्रश्न को पढ़ने के बाद काफी समय बाद इसे पोस्ट किया गया है मैंने एक और समाधान पोस्ट करने का फैसला किया है, क्योंकि मुझे यह नहीं मिला कि यह काफी संतोषजनक है, कम से कम मेरी जरूरतों के लिए:

मैंने कुछ इस तरह इस्तेमाल किया है:

var currentDate= new Date().setHours(0,0,0,0);

var startDay = new Date(currentDate - 86400000 * 2);
var finalDay = new Date(currentDate + 86400000 * 2);

इस तरह मैं उस प्रारूप में तारीखों का उपयोग कर सकता था जिसे मैं बाद में प्रसंस्करण के लिए चाहता था। लेकिन यह केवल मेरी जरूरत के लिए था, लेकिन मैंने इसे वैसे भी पोस्ट करने का फैसला किया है, शायद यह किसी की मदद करेगा


1
कृपया ध्यान दें कि आपका currentDateचर दिनांक नहीं है, यह 1970-01-01 से मिलीसेकंड की संख्या है। यह setHours()विधि उस तिथि वस्तु को संशोधित करती है जिसे यह कहा जाता है, और getTime()1970-01-01 के बाद से (मिलीसेकंड में तारीख का मूल्य) के बराबर लौटाता है ।
टिमोथी वाल्टर्स

1

सुनिश्चित करें कि आप userDate4 अंकों के वर्ष के साथ निर्माण कर रहे हैं setFullYear(10, ...) !== setFullYear(2010, ...)


1

आप कुल एमएस के साथ कुछ अंकगणित का उपयोग कर सकते हैं।

var date = new Date(date1);
date.setHours(0, 0, 0, 0);

var diff = date2.getTime() - date.getTime();
return diff >= 0 && diff < 86400000;

मुझे यह पसंद है क्योंकि मूल तिथियों के लिए कोई भी अपडेट नहीं किया गया है और स्ट्रिंग स्प्लिट और तुलना की तुलना में तेजी से परफ्यूम करता है।

उममीद है कि इससे मदद मिलेगी!


1

यह जेएस सेट की तारीख के बाद सामग्री को यहां एक ही चीज पर w3schools पर बदल देगा

date1 = new Date()
date2 = new Date(2019,5,2) //the date you are comparing

date1.setHours(0,0,0,0)

var stockcnt = document.getElementById('demo').innerHTML;
if (date1 > date2){
document.getElementById('demo').innerHTML="yes"; //change if date is > set date (date2)
}else{
document.getElementById('demo').innerHTML="hello"; //change if date is < set date (date2)
}
<p id="demo">hello</p> <!--What will be changed-->
<!--if you check back in tomorrow, it will say yes instead of hello... or you could change the date... or change > to <-->


1

यह मेरे लिए काम करता है:

 export default (chosenDate) => {
  const now = new Date();
  const today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
  const splitChosenDate = chosenDate.split('/');

  today.setHours(0, 0, 0, 0);
  const fromDate = today.getTime();
  const toDate = new Date(splitChosenDate[2], splitChosenDate[1] - 1, splitChosenDate[0]).getTime();

  return toDate < fromDate;
};

स्वीकृत उत्तर में, टाइमज़ोन समस्या है और अन्य समय में 00:00:00 नहीं है


0

मुझे पता है कि यह सवाल पहले ही जवाब दे दिया गया है और यह सबसे अच्छा तरीका नहीं हो सकता है, लेकिन मेरे परिदृश्य में इसका पूरी तरह से काम करना, इसलिए मैंने सोचा कि यह मेरे जैसे किसी व्यक्ति की मदद कर सकता है।

यदि आपके पास date stringहै

String dateString="2018-01-01T18:19:12.543";

और आप केवल जेएस में किसी अन्य दिनांक ऑब्जेक्ट के साथ दिनांक भाग की तुलना करना चाहते हैं,

var anotherDate=new Date(); //some date

तो आप के लिए है करने के लिए का उपयोग करके वस्तुconvertstringDatenew Date("2018-01-01T18:19:12.543");

और यहाँ चाल है: -

var valueDate =new Date(new Date(dateString).toDateString());

            return valueDate.valueOf() == anotherDate.valueOf(); //here is the final result

मैंने JS toDateString()का उपयोग किया है Date object, जो केवल तारीख स्ट्रिंग लौटाता है।

नोट: .valueOf()तिथियों की तुलना करते समय फ़ंक्शन का उपयोग करना न भूलें ।

अधिक जानकारी .valeOf()यहाँ संदर्भ के बारे में है

खुश कोडिंग।


0

ये सहायता करेगा। मैं इसे इस तरह पाने में कामयाब रहा।

var currentDate = new Date(new Date().getFullYear(), new Date().getMonth() , new Date().getDate())

0

से तुलना करना setHours()एक समाधान होगा। नमूना:

var d1 = new Date();
var d2 = new Date("2019-2-23");
if(d1.setHours(0,0,0,0) == d2.setHours(0,0,0,0)){
    console.log(true)
}else{
    console.log(false)
}

0
var fromdate = new Date(MM/DD/YYYY);
var todate = new Date(MM/DD/YYYY);
if (fromdate > todate){
    console.log('False');
}else{
    console.log('True');
}

अगर आपकी तारीख अलग है, तो अपनी तारीख के प्रारूप को बदलने के लिए क्षण.जेएस लाइब्रेरी का उपयोग करें और फिर दो तारीखों की तुलना करने के लिए उपरोक्त कोड का उपयोग करें

उदाहरण :

यदि आपकी तिथि "DD / MM / YYYY" में है और इसे "MM / DD / YYYY" में बदलना चाहते हैं, तो नीचे दिया कोड उदाहरण देखें

var newfromdate = new Date(moment(fromdate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newfromdate);
var newtodate = new Date(moment(todate, "DD/MM/YYYY").format("MM/DD/YYYY"));
console.log(newtodate);

0

आप fp_incr (0) का उपयोग कर सकते हैं। जो मध्यरात्रि के भाग को मध्यरात्रि में सेट करता है और एक दिनांक वस्तु देता है।

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