क्योंकि "की परिभाषा में उम्र वर्ष" है... लचीला, सबसे आसान तरीका है का उपयोग करने के लिए एक छोटे से गणित के रूप में आप यह गणना में अपने सिर, और नहीं शामिल Date
वर्ग.
के लिए [एक] मानव की व्याख्या "की उम्र में" महीने, नियम है
गणना के बीच अंतर दो तिथियों में महीने,
के रूप में अगर दिन के महीने में किया गया था 1 महीने के लिए दोनों तिथियाँ
घटाना 1 बाहर करने के लिए अंतिम माह
तो, अगर दिन के महीने के अंतिम दिन की अवधि पर है
या दिन के बाद के महीने के पहले दिन से अवधि, [संभवतः आंशिक] अंतिम महीने में पूरा हो गया है: जोड़ना 1 को पुनर्स्थापित करने के लिए गिनती
इस मरहम में एक मक्खी है, के बाद से महीने होते हैं अलग अलग संख्या के दिनों के साथ निपटने के मामलों में जहां 2 महीने अलग-अलग दिनों की संख्या.
अगर, हालांकि, अंत में महीने की तुलना में कम है शुरू, एक महीने में, आप में प्राप्त कर सकते हैं, जहां एक की स्थिति की सीमा शर्त कर सकते हैं कभी नहीं मिले हो (उदाहरण के लिए, शुरू करने की तारीख है फ़रवरी 28 और अंत की तारीख है 31 मार्च. कि ठीक करने के लिए, आप की जरूरत है पर देखो करने के लिए "महीने के अंत" के रूप में किया जा रहा है एक खिड़की से लेकर अंतिम दिन के शुरू में महीने के अंतिम दिन के माध्यम से अंत महीने समावेशी.
है कि सुराग के लिए इस कोड. मैं कर रहा हूँ का उपयोग कर एक संरचना की तरह निम्नलिखित का प्रतिनिधित्व करने के लिए एक तिथि:
{
year: 2021 , // 4-digit year
month: 11 , // month of year (1-12 mapping to January-December)
day: 23 // day of month (1-[28-31] depending on year/month
}
सुनिश्चित करना है कि डेटा में है कि संरचना का प्रतिनिधित्व करता है एक मान्य दिनांक छोड़ दिया है एक व्यायाम के रूप में पाठक के लिए.
कोड है कि जटिल नहीं है:
/**
*
* @param {object} bgn - start date of period
* @param {number} bgn.year - 4-digit year
* @param {number} bgn.month - month of year [1-12]
* @param {number} bgn.day - day of month [1-31]
*
* @param {object} end - end date of period
* @param {number} end.year - 4-digit year
* @param {number} end.month - month of year [1-12]
* @param {number} end.day - day of month [1-31]
*
*/
function diffInMonths( bgn , end ) {
const between = ( x , min , max ) => x >= min && x <= max;
// We'll need to add back the final month based on the following:
// - end.day >= bgn.day -- we've passed the month boundary, or
// - end.day is within the end-of-month window
// (when the end month is shorter than the start month)
const needAdjustment = end.day >= bgn.day
|| between( end.day, daysInMonth(bgn), daysInMonth(end) );
const finalMonthAdjustment = needsAdjustment ? 1 : 0;
const deltaM = 12 * ( end.year - bgn.year )
+ ( end.month - bgn.month )
- 1 // remove the final month from the equation
+ finalMonthAdjustment // add in the precomputed final month adjustment
;
return deltaM;
}
/**
*
* @param {object} dt - date
* @param {number} dt.year - 4-digit year
* @param {number} dt.month - month of year [1-12]
* @param {number} dt.day - day of month [1-31]
*
*/
function daysInMonth(dt) {
const leapYear = ( dt.year % 4 === 0 && dt.year % 100 !== 0 ) || dt.year % 400 === 0;
const monthDays = leapYear ? daysPerMonthLeap : daysPerMonth;
const days = monthDays[dt.month];
return days;
}
// jan feb mar apr may jun jul aug sep oct nov dec
// ---------- --- --- --- --- --- --- --- --- --- --- --- ---
const daysPerMonth = [ undefined, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, ];
const daysPerMonthLeap = [ undefined, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, ];
new Date(userDate.split('/').reverse())
लगभग निश्चित रूप से वापस एक अमान्य तिथि.