जावास्क्रिप्ट में दो तिथियों के बीच महीनों में अंतर


135

मैं जावास्क्रिप्ट में दो दिनांक () ऑब्जेक्ट के लिए अंतर कैसे काम करूंगा, जबकि केवल अंतर में महीनों की संख्या वापस आ जाएगी?

कोई भी मदद बहुत अच्छी रहेगी :)


एक महीने माप की एक बहुत सटीक इकाई नहीं है क्योंकि महीने की लंबाई किस महीने के आधार पर बदलती है। यदि एक अंतराल जनवरी और फरवरी के बीच 30 दिनों तक रहता है, तो यह 1 महीने से कम है यदि आप 31 दिन के महीने के संदर्भ में सोचते हैं, लेकिन फरवरी 28 या 29 दिनों पर विचार करें तो 1 महीने से अधिक।
मार्क बायर्स

7
बहुत अच्छी तरह से परिभाषित प्रश्न नहीं है। क्या फरवरी 28 23:58 से मार्च 1 00:01 एक महीने है? या सिर्फ एक दिन? या सिर्फ तीन मिनट? या तीनों?
थिलो

1
@ थिलो किसी को इसे लागू करने की आवश्यकता है, शायद उनके पास जवाब नहीं होगा, क्योंकि उनके प्रबंधक को यह पता नहीं है कि वे पहली जगह में क्या पूछ रहे हैं। :)
अल्बर्टबेलबेल

जवाबों:


229

"अंतर में महीनों की संख्या" की परिभाषा बहुत व्याख्या के अधीन है। :-)

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

उदाहरण के लिए, ऑफ-द-कफ:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

(ध्यान दें कि जावास्क्रिप्ट में महीने का मान 0 = जनवरी से शुरू होता है।)

उपरोक्त में भिन्नात्मक महीनों को शामिल करना अधिक जटिल है, क्योंकि एक फरवरी में तीन दिन उस महीने का एक बड़ा अंश है (~ 10.714%) अगस्त में तीन दिनों की तुलना में (~ 9.677%), और निश्चित रूप से फरवरी भी एक चलती लक्ष्य है यह एक लीप वर्ष है पर निर्भर करता है।

जावास्क्रिप्ट के लिए कुछ तारीख और समय पुस्तकालय भी उपलब्ध हैं जो संभवतः इस तरह की चीज़ को आसान बनाते हैं।


नोट : + 1ऊपर, यहाँ एक हुआ करता था:

months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
// −−−−−−−−−−−−−−−−−−−−^^^^
months += d2.getMonth();

ऐसा इसलिए है क्योंकि मूल रूप से मैंने कहा था:

... यह पता चलता है कि दो महीने के बीच कितने पूरे महीने झूठ होते हैं, आंशिक महीनों की गिनती नहीं (उदाहरण के लिए, प्रत्येक तारीख को छोड़कर महीने में)।

मैंने इसे दो कारणों से हटा दिया है:

  1. आंशिक महीनों की गिनती नहीं करने से पता चलता है कि उत्तर में आने वाले कितने (अधिकांश?) लोग चाहते हैं, इसलिए मैंने सोचा कि मुझे उन्हें अलग करना चाहिए।

  2. यह हमेशा उस परिभाषा से भी काम नहीं करता था। :-D (क्षमा करें)


82

यदि आप महीने के दिन पर विचार नहीं करते हैं, तो यह सरल समाधान है

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() + 
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1

ज्ञात हो कि महीने का सूचकांक 0-आधारित है। इसका मतलब है कि January = 0और December = 11


11
यह सबसे छोटा और सबसे आसान कोड है जिसे मैंने अब तक देखा है!
उमर

इस तथ्य के साथ कुछ भी जटिल नहीं है कि इस तथ्य को छोड़कर कि हर महीने शुरू किया गया गिनती गिना जाता है। 31/03/2011 -> 01/05/2011 दो महीने के साथ-साथ 01/03/2011 -> 31/05/2011 होगा, लेकिन यह सटीक होने के लिए तीन होना चाहिए।
नटिम

यदि आप सिर्फ महीने की संख्या जानना चाहते हैं तो यह सही है !!!!! यदि आपको महीने में दिनों के आधार पर जानने की आवश्यकता है तो यह काम नहीं करेगा।
ओएसडीएम

1
इस तथ्य से शुरू करें कि 2018/01 और 2017/01 12 महीने अलग हैं। वहां से पीछे की ओर काम करें। यह उत्तर उसे मिल जाता है। ;)
गेरार्ड ओनली

1
धन्यवाद! यह फंक्शन मेरे लिए बहुत उपयोगी है
Trương Long

29

कभी-कभी आप दो भागों के बीच के महीनों की मात्रा प्राप्त करना चाहते हैं, जो कि दिन के भाग को पूरी तरह से अनदेखा करते हैं। उदाहरण के लिए, यदि आपके पास दो तिथियां हैं- 2013/06/21 और 2013/10 / 18- और आप केवल 2013/06 और 2013/10 भागों की परवाह करते हैं, तो यहां परिदृश्य और संभावित समाधान हैं:

var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
var date2=new Date(2013,9,18);
var year1=date1.getFullYear();
var year2=date2.getFullYear();
var month1=date1.getMonth();
var month2=date2.getMonth();
if(month1===0){ //Have to take into account
  month1++;
  month2++;
}
var numberOfMonths; 

1. यदि आप दोनों तारीखों के बीच के महीनों की संख्या चाहते हैं तो महीने 1 और महीने 2 को छोड़कर

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;

2.अगर आप दोनों में से किसी भी महीने को शामिल करना चाहते हैं

numberOfMonths = (year2 - year1) * 12 + (month2 - month1);

3.अगर आप दोनों महीनों को शामिल करना चाहते हैं

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;

अच्छा है! मेरे लिए परफेक्ट काम किया।

3
पिछले एक के लिए, मैं सिफारिश करूँगा: numberOfMonths=(year2-year1)*12+(month2-month1)+1;जो ऐसा ही करता है, लेकिन मेरे लिए अधिक शब्दार्थ से सही है
नटिम

हाँ, अच्छा और अधिक सुरुचिपूर्ण दृष्टिकोण।
मिकाईल अब्दुल्लायेव

यह सबसे अच्छा जवाब था। धन्यवाद!
मारीनेके

यह सरल और साफ है। बढ़िया कोड लिखने के लिए धन्यवाद।
शून्य-

28

यहां एक फ़ंक्शन है जो 2 तिथियों के बीच महीनों की संख्या प्रदान करता है।
डिफ़ॉल्ट व्यवहार केवल पूरे महीने की गणना करता है, उदाहरण के लिए 3 महीने और 1 दिन में 3 महीने का अंतर होगा। आप इसे roundUpFractionalMonthsपरम को सेट करके रोक सकते हैंtrue , इसलिए 4 महीने के 3 महीने और 1 दिन का अंतर लौटाया जाएगा।

उपरोक्त स्वीकृत उत्तर (TJ Crowder का उत्तर) सटीक नहीं है, यह कभी-कभी गलत मान देता है।

उदाहरण के लिए, monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))रिटर्न0 जो स्पष्ट रूप से गलत है। सही अंतर या तो पूरे 1 महीने का है या 2 महीने का है।

यहां मैंने जो फ़ंक्शन लिखा है:

function getMonthsBetween(date1,date2,roundUpFractionalMonths)
{
    //Months will be calculated between start and end dates.
    //Make sure start date is less than end date.
    //But remember if the difference should be negative.
    var startDate=date1;
    var endDate=date2;
    var inverse=false;
    if(date1>date2)
    {
        startDate=date2;
        endDate=date1;
        inverse=true;
    }

    //Calculate the differences between the start and end dates
    var yearsDifference=endDate.getFullYear()-startDate.getFullYear();
    var monthsDifference=endDate.getMonth()-startDate.getMonth();
    var daysDifference=endDate.getDate()-startDate.getDate();

    var monthCorrection=0;
    //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up.
    //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months.
    if(roundUpFractionalMonths===true && daysDifference>0)
    {
        monthCorrection=1;
    }
    //If the day difference between the 2 months is negative, the last month is not a whole month.
    else if(roundUpFractionalMonths!==true && daysDifference<0)
    {
        monthCorrection=-1;
    }

    return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection);
};

6
गंभीरता से हालांकि, यह वोट किसने दिया? वह सही है, स्वीकृत जवाब सिर्फ ... गलत है।
माइकल ब्लैकबर्न

2
यह सबसे फिट जवाब है।
कल्याण चावली

यह सही नहीं है यदि हम कहते हैं कि तारीख 1 22 वां है, और तारीख 2 22 वाँ है। फिर यह 7 लौटता है, जो स्पष्ट रूप से 8 होना चाहिए?
निकोलई हारबो

यह स्वीकृत उत्तर दें। यह स्वीकार किए जाते हैं की तुलना में अधिक सटीक है। उदाहरण के लिए स्वीकार किए गए उत्तर दिनों की गणना नहीं करता है
मुन्खेल्डर तुमनबेयार

क्राउडर का स्वीकृत उत्तर तब से अपडेट किया गया है। इसके और इस उत्तर के बीच अभी भी महत्वपूर्ण अंतर हो सकते हैं, लेकिन, इस लेखन के रूप में, यहां सूचीबद्ध चिंताओं को संबोधित किया गया है।
१०:३

23

यदि आपको महीने की 28, 29, 30 या 31 दिनों की परवाह किए बिना पूरे महीने गिनने की जरूरत है। नीचे काम करना चाहिए।

var months = to.getMonth() - from.getMonth() 
    + (12 * (to.getFullYear() - from.getFullYear()));

if(to.getDate() < from.getDate()){
    months--;
}
return months;

यह उत्तर https://stackoverflow.com/a/4312956/1987208 का विस्तारित संस्करण है लेकिन इस मामले को ठीक करता है जहां यह 31 जनवरी से 1 फरवरी (1 दिन) तक मामले के लिए 1 महीने की गणना करता है।

यह निम्नलिखित को कवर करेगा;

  • 1 जनवरी से 31 जनवरी ---> 30 दिन ---> 0 में परिणाम होगा (चूंकि यह पूर्ण माह नहीं है)
  • 1 फरवरी से 1 मार्च ---> 28 या 29 दिन ---> 1 में परिणाम होगा (चूंकि यह पूर्ण माह है)
  • 15 फरवरी से 15 मार्च ---> 28 या 29 दिन ---> 1 में परिणाम होगा (एक महीने के बाद से तार्किक)
  • 31 जनवरी से 1 फरवरी तक ---> 1 दिन ---> 0 में परिणाम होगा (1 महीने में पोस्ट परिणामों में स्पष्ट लेकिन वर्णित उत्तर)

2
था की क्या मुझे लगा कि मैं यहां सत्यापन के लिए आया हूं और यही एकमात्र उत्तर है जो मुझे समझ में आता है
एंड्रियास

2
दो महीने की तुलना में यह काम नहीं करता है, जहां महीना छोटा होता है। उदाहरण के लिए, 31 मार्च से 30 अप्रैल तक। यह सब अप्रैल का है, इसलिए उत्तर "1." होना चाहिए
माइकल ब्लैकबर्न

7

जावास्क्रिप्ट में दो तिथियों के बीच के महीनों में अंतर:

 start_date = new Date(year, month, day); //Create start date object by passing appropiate argument
 end_date = new Date(new Date(year, month, day)

start_date और end_date के बीच के कुल महीने:

 total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())

6

मुझे पता है कि यह वास्तव में देर हो चुकी है, लेकिन वैसे भी इसे पोस्ट करने से दूसरों को मदद मिलती है। यहाँ एक समारोह है जो मैं दो तिथियों के बीच के महीनों में मतभेदों को गिनने का एक अच्छा काम करने लगता है। यह वास्तव में Mr.Crowder की तुलना में एक बढ़िया सौदा है, लेकिन डेट ऑब्जेक्ट के माध्यम से कदम बढ़ाकर अधिक सटीक परिणाम प्रदान करता है। यह AS3 में है, लेकिन आपको केवल मजबूत टाइपिंग को छोड़ने में सक्षम होना चाहिए और आपके पास JS होगा। वहाँ किसी को भी बाहर देख यह अच्छा बनाने के लिए स्वतंत्र महसूस करो!

    function countMonths ( startDate:Date, endDate:Date ):int
    {
        var stepDate:Date = new Date;
        stepDate.time = startDate.time;
        var monthCount:int;

        while( stepDate.time <= endDate.time ) { 
            stepDate.month += 1;
            monthCount += 1;
        }           

        if ( stepDate != endDate ) { 
            monthCount -= 1;
        }

        return monthCount;
    }

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

5

@ टीजे के उत्तर पर विस्तार करने के लिए, यदि आप पूर्ण कैलेंडर महीनों के बजाय साधारण महीनों की तलाश कर रहे हैं, तो आप बस यह देख सकते हैं कि क्या d2 की तारीख d1 की तुलना में अधिक या बराबर है। यही है, अगर d2 अपने महीने में बाद में है, d1 अपने महीने में है, तो 1 और महीना है। तो आपको बस ऐसा करने में सक्षम होना चाहिए:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth() + 1;
    months += d2.getMonth();
    // edit: increment months if d2 comes later in its month than d1 in its month
    if (d2.getDate() >= d1.getDate())
        months++
    // end edit
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16; 4 Nov – 4 Dec '08, 4 Dec '08 – 4 Dec '09, 4 Dec '09 – 4 March '10

यह समय के मुद्दों के लिए पूरी तरह से खाता नहीं है (जैसे 3 मार्च को शाम 4:00 बजे और 3 अप्रैल को दोपहर 3:00 बजे), लेकिन यह अधिक सटीक है और कोड की सिर्फ एक दो पंक्तियों के लिए है।


5

महीनों के संदर्भ में प्रत्येक तिथि पर विचार करें, फिर अंतर खोजने के लिए घटाएं।

var past_date = new Date('11/1/2014');
var current_date = new Date();

var difference = (current_date.getFullYear()*12 + current_date.getMonth()) - (past_date.getFullYear()*12 + past_date.getMonth());

यह आपको दो तिथियों के बीच महीनों का अंतर मिलेगा, दिनों की अनदेखी।


4

गणितीय और त्वरित दो दृष्टिकोण हैं, लेकिन कैलेंडर में योनि के अधीन हैं, या पुनरावृत्त और धीमे हैं, लेकिन सभी विषमताओं को संभालते हैं (या कम से कम प्रतिनिधियों को अच्छी तरह से परीक्षण किए गए पुस्तकालय के लिए संभालते हैं)।

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

अब, यदि आप किसी डेटासेट पर इस फ़ंक्शन की गणना कर रहे हैं , तो आप संभवतः उस फ़ंक्शन को प्रत्येक पंक्ति पर (या प्रति रिकॉर्ड कई बार, भगवान ना करें) चलाना नहीं चाहते हैं। उस स्थिति में, आप स्वीकृत उत्तर को छोड़कर यहां किसी भी अन्य उत्तर का उपयोग कर सकते हैं , जो कि सिर्फ गलत है ( new Date()और new Date()-1 के बीच अंतर है)?

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

function diffInMonths(from, to){
    var months = to.getMonth() - from.getMonth() + (12 * (to.getFullYear() - from.getFullYear()));

    if(to.getDate() < from.getDate()){
        var newFrom = new Date(to.getFullYear(),to.getMonth(),from.getDate());
        if (to < newFrom  && to.getMonth() == newFrom.getMonth() && to.getYear() %4 != 0){
            months--;
        }
    }

    return months;
}

3

यहां आप कम लूपिंग के साथ अन्य दृष्टिकोण पर जाते हैं:

calculateTotalMonthsDifference = function(firstDate, secondDate) {
        var fm = firstDate.getMonth();
        var fy = firstDate.getFullYear();
        var sm = secondDate.getMonth();
        var sy = secondDate.getFullYear();
        var months = Math.abs(((fy - sy) * 12) + fm - sm);
        var firstBefore = firstDate > secondDate;
        firstDate.setFullYear(sy);
        firstDate.setMonth(sm);
        firstBefore ? firstDate < secondDate ? months-- : "" : secondDate < firstDate ? months-- : "";
        return months;
}

1
इस विधि से सावधान रहें: यह (स्पष्ट रूप से जब आप इसे ध्यान से पढ़ते हैं) पहली तारीख को म्यूट करता है जो कॉलर को वापस भेज दिया जाता है (जैसा कि तिथियां संदर्भ द्वारा पारित की जाती हैं)।
एंडीह

3

आप इस समाधान पर भी विचार कर सकते हैं, यह functionपूर्णांक या संख्या में महीने का अंतर लौटाता है

शुरुआत की तारीख को पहले या आखिरी के रूप में पारित करना param, दोष सहिष्णु है। मतलब, फ़ंक्शन अभी भी समान मान लौटाएगा।

const diffInMonths = (end, start) => {
   var timeDiff = Math.abs(end.getTime() - start.getTime());
   return Math.round(timeDiff / (2e3 * 3600 * 365.25));
}

const result = diffInMonths(new Date(2015, 3, 28), new Date(2010, 1, 25));

// shows month difference as integer/number
console.log(result);


आपको लीप वर्ष को ध्यान में रखते हुए 365.25 गुणा करना चाहिए
darryn.ten

2

दो तिथियों के बीच अंतर की गणना महीने (दिन) के अंश शामिल हैं।


var difference = (date2.getDate() - date1.getDate()) / 30 +
    date2.getMonth() - date1.getMonth() +
    (12 * (date2.getFullYear() - date1.getFullYear()));

उदाहरण के लिए: तारीख
1 : 24/09/2015 (24 वां सितंबर 2015)
तारीख 2 : 09/11/2015 (9 नवंबर 2015)
अंतर: 2.5 (महीने)


2

यह ठीक काम करना चाहिए:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months += d2.getMonth() - d1.getMonth();
    return months;
}

1
function calcualteMonthYr(){
    var fromDate =new Date($('#txtDurationFrom2').val()); //date picker (text fields)
    var toDate = new Date($('#txtDurationTo2').val());

var months=0;
        months = (toDate.getFullYear() - fromDate.getFullYear()) * 12;
        months -= fromDate.getMonth();
        months += toDate.getMonth();
            if (toDate.getDate() < fromDate.getDate()){
                months--;
            }
    $('#txtTimePeriod2').val(months);
}

1

निम्नलिखित कोड आंशिक तारीखों के दिनों को ध्यान में रखते हुए दो तारीखों के बीच पूरे महीने का रिटर्न देते हैं।

var monthDiff = function(d1, d2) {
  if( d2 < d1 ) { 
    var dTmp = d2;
    d2 = d1;
    d1 = dTmp;
  }

  var months = (d2.getFullYear() - d1.getFullYear()) * 12;
  months -= d1.getMonth() + 1;
  months += d2.getMonth();

  if( d1.getDate() <= d2.getDate() ) months += 1;

  return months;
}

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 20))
> 1

monthDiff(new Date(2015, 01, 20), new Date(2015, 02, 19))
> 0

monthDiff(new Date(2015, 01, 20), new Date(2015, 01, 22))
> 0

1
function monthDiff(d1, d2) {
var months, d1day, d2day, d1new, d2new, diffdate,d2month,d2year,d1maxday,d2maxday;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
months += d2.getMonth();
months = (months <= 0 ? 0 : months);
d1day = d1.getDate();
d2day = d2.getDate();
if(d1day > d2day)
{
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d1new = new Date(d2year, d2month-1, d1day,0,0,0,0);
    var timeDiff = Math.abs(d2.getTime() - d1new.getTime());
          diffdate = Math.abs(Math.ceil(timeDiff / (1000 * 3600 * 24))); 
    d1new = new Date(d2year, d2month, 1,0,0,0,0);
    d1new.setDate(d1new.getDate()-1);
    d1maxday = d1new.getDate();
    months += diffdate / d1maxday;
}
else
{
      if(!(d1.getMonth() == d2.getMonth() && d1.getFullYear() == d2.getFullYear()))
    {
        months += 1;
    }
    diffdate = d2day - d1day + 1;
    d2month = d2.getMonth();
    d2year = d2.getFullYear();
    d2new = new Date(d2year, d2month + 1, 1, 0, 0, 0, 0);
    d2new.setDate(d2new.getDate()-1);
    d2maxday = d2new.getDate();
    months += diffdate / d2maxday;
}

return months;

}


1

नीचे दिए गए तर्क महीनों में अंतर लाएंगे

(endDate.getFullYear()*12+endDate.getMonth())-(startDate.getFullYear()*12+startDate.getMonth())

1
function monthDiff(date1, date2, countDays) {

  countDays = (typeof countDays !== 'undefined') ?  countDays : false;

  if (!date1 || !date2) {
    return 0;
  }

  let bigDate = date1;
  let smallDate = date2;

  if (date1 < date2) {
    bigDate = date2;
    smallDate = date1;
  }

  let monthsCount = (bigDate.getFullYear() - smallDate.getFullYear()) * 12 + (bigDate.getMonth() - smallDate.getMonth());

  if (countDays && bigDate.getDate() < smallDate.getDate()) {
    --monthsCount;
  }

  return monthsCount;
}

0

देखें कि मैं क्या उपयोग करता हूं:

function monthDiff() {
    var startdate = Date.parseExact($("#startingDate").val(), "dd/MM/yyyy");
    var enddate = Date.parseExact($("#endingDate").val(), "dd/MM/yyyy");
    var months = 0;
    while (startdate < enddate) {
        if (startdate.getMonth() === 1 && startdate.getDate() === 28) {
            months++;
            startdate.addMonths(1);
            startdate.addDays(2);
        } else {
            months++;
            startdate.addMonths(1);
        }
    }
    return months;
}

0

यह दिनों को भी गिनता है और महीनों में बदल देता है।

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;   //calculates months between two years
    months -= d1.getMonth() + 1; 
    months += d2.getMonth();  //calculates number of complete months between two months
    day1 = 30-d1.getDate();  
    day2 = day1 + d2.getDate();
    months += parseInt(day2/30);  //calculates no of complete months lie between two dates
    return months <= 0 ? 0 : months;
}

monthDiff(
    new Date(2017, 8, 8), // Aug 8th, 2017    (d1)
    new Date(2017, 12, 12)  // Dec 12th, 2017   (d2)
);
//return value will be 4 months 

क्या आप अधिक विस्तृत विवरण जोड़ सकते हैं कि यह कैसे काम करता है? यह उत्तर को बेहतर
बनाएगा

क्या एक धारणा के महीनों में 30 दिन हैं?
बेन टालियाडोरोस

0

महीने की संख्या जब दिन और समय नहीं होता है

इस मामले में, मुझे पूरे महीने, भाग के महीनों, एक महीने में कितना समय है आदि से संबंधित नहीं है, मुझे सिर्फ महीनों की संख्या जानने की आवश्यकता है। एक प्रासंगिक वास्तविक विश्व मामला वह होगा जहां हर महीने एक रिपोर्ट होने वाली है, और मुझे यह जानना होगा कि वहाँ कितनी रिपोर्ट होनी चाहिए।

उदाहरण:

  • जनवरी = 1 महीना
  • जनवरी - फरवरी = 2 महीने
  • नवंबर - जनवरी = 3 महीने

यह दिखाने के लिए एक विस्तृत कोड उदाहरण है जहाँ संख्याएँ जा रही हैं।

चलो 2 टाइमस्टैम्प लेते हैं जिसका परिणाम 4 महीने में होना चाहिए

  • 13 नवंबर, 2019 का टाइमस्टैम्प: 1573621200000
  • 20 फरवरी, 2020 का टाइमस्टैम्प: 1582261140000

अपने समयक्षेत्र / खींचे गए समय के साथ थोड़ा अलग हो सकता है। दिन, मिनट और सेकंड मायने नहीं रखते हैं और टाइमस्टैम्प में शामिल किया जा सकता है, लेकिन हम इसे अपनी वास्तविक गणना के साथ अवहेलना करेंगे।

चरण 1: टाइमस्टैम्प को जावास्क्रिप्ट तिथि में बदलें

let dateRangeStartConverted = new Date(1573621200000);
let dateRangeEndConverted = new Date(1582261140000);

चरण 2: महीनों / वर्षों के लिए पूर्णांक मान प्राप्त करें

let startingMonth = dateRangeStartConverted.getMonth();
let startingYear = dateRangeStartConverted.getFullYear();
let endingMonth = dateRangeEndConverted.getMonth();
let endingYear = dateRangeEndConverted.getFullYear();

यह हमें देता है

  • महीने की शुरुआत: 11
  • वर्ष शुरू: 2019
  • अंतिम महीना: २
  • अंतिम वर्ष: 2020

चरण 3: (12 * (endYear - startYear)) + 1समाप्त होने वाले महीने में जोड़ें ।

  • यह हमारे शुरुआती महीने को 11 पर बना देता है
  • यह हमारे समाप्त होने वाले महीने को 15 के बराबर बनाता है 2 + (12 * (2020 - 2019)) + 1 = 15

चरण 4: महीनों को घटाएं

15 - 11 = 4; हमें अपना 4 महीने का परिणाम मिलता है।

29 महीने का उदाहरण

नवंबर 2019 मार्च 2022 तक 29 महीने है। यदि आप इन्हें एक्सेल स्प्रेडशीट में रखते हैं, तो आपको 29 पंक्तियाँ दिखाई देंगी।

  • हमारा शुरुआती महीना 11 है
  • हमारा अंतिम महीना 40 है 3 + (12 * (2022-2019)) + 1

40 - 11 = 29


-2
anyVar = (((DisplayTo.getFullYear() * 12) + DisplayTo.getMonth()) - ((DisplayFrom.getFullYear() * 12) + DisplayFrom.getMonth()));

3
हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
यूजीन पॉडस्कल

यह एक जवाब पोस्ट करने के लिए बहुत उपयोग नहीं है जो उन कार्यों पर निर्भर करता है जो व्याख्या में या परिभाषित नहीं हैं।
RobG

-7

एक दृष्टिकोण एक सरल जावा वेब सेवा (REST / JSON) लिखना होगा जो Joda लाइब्रेरी का उपयोग करता है

http://joda-time.sourceforge.net/faq.html#datediff

दो तारीखों के बीच अंतर की गणना करने और जावास्क्रिप्ट से उस सेवा को कॉल करने के लिए।

यह मानता है कि आपका बैक एंड जावा में है।

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