मैं जावास्क्रिप्ट में दो दिनांक () ऑब्जेक्ट के लिए अंतर कैसे काम करूंगा, जबकि केवल अंतर में महीनों की संख्या वापस आ जाएगी?
कोई भी मदद बहुत अच्छी रहेगी :)
मैं जावास्क्रिप्ट में दो दिनांक () ऑब्जेक्ट के लिए अंतर कैसे काम करूंगा, जबकि केवल अंतर में महीनों की संख्या वापस आ जाएगी?
कोई भी मदद बहुत अच्छी रहेगी :)
जवाबों:
"अंतर में महीनों की संख्या" की परिभाषा बहुत व्याख्या के अधीन है। :-)
आप जावास्क्रिप्ट दिनांक ऑब्जेक्ट से वर्ष, माह और माह का दिन प्राप्त कर सकते हैं। आप किस जानकारी की तलाश कर रहे हैं, इसके आधार पर, आप यह पता लगाने के लिए उपयोग कर सकते हैं कि समय के दो बिंदुओं के बीच कितने महीने हैं।
उदाहरण के लिए, ऑफ-द-कफ:
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();
ऐसा इसलिए है क्योंकि मूल रूप से मैंने कहा था:
... यह पता चलता है कि दो महीने के बीच कितने पूरे महीने झूठ होते हैं, आंशिक महीनों की गिनती नहीं (उदाहरण के लिए, प्रत्येक तारीख को छोड़कर महीने में)।
मैंने इसे दो कारणों से हटा दिया है:
आंशिक महीनों की गिनती नहीं करने से पता चलता है कि उत्तर में आने वाले कितने (अधिकांश?) लोग चाहते हैं, इसलिए मैंने सोचा कि मुझे उन्हें अलग करना चाहिए।
यह हमेशा उस परिभाषा से भी काम नहीं करता था। :-D (क्षमा करें)
यदि आप महीने के दिन पर विचार नहीं करते हैं, तो यह सरल समाधान है
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
।
कभी-कभी आप दो भागों के बीच के महीनों की मात्रा प्राप्त करना चाहते हैं, जो कि दिन के भाग को पूरी तरह से अनदेखा करते हैं। उदाहरण के लिए, यदि आपके पास दो तिथियां हैं- 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;
numberOfMonths=(year2-year1)*12+(month2-month1)+1;
जो ऐसा ही करता है, लेकिन मेरे लिए अधिक शब्दार्थ से सही है
यहां एक फ़ंक्शन है जो 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);
};
यदि आपको महीने की 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 महीने की गणना करता है।
यह निम्नलिखित को कवर करेगा;
जावास्क्रिप्ट में दो तिथियों के बीच के महीनों में अंतर:
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())
मुझे पता है कि यह वास्तव में देर हो चुकी है, लेकिन वैसे भी इसे पोस्ट करने से दूसरों को मदद मिलती है। यहाँ एक समारोह है जो मैं दो तिथियों के बीच के महीनों में मतभेदों को गिनने का एक अच्छा काम करने लगता है। यह वास्तव में 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;
}
@ टीजे के उत्तर पर विस्तार करने के लिए, यदि आप पूर्ण कैलेंडर महीनों के बजाय साधारण महीनों की तलाश कर रहे हैं, तो आप बस यह देख सकते हैं कि क्या 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 बजे), लेकिन यह अधिक सटीक है और कोड की सिर्फ एक दो पंक्तियों के लिए है।
महीनों के संदर्भ में प्रत्येक तिथि पर विचार करें, फिर अंतर खोजने के लिए घटाएं।
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());
यह आपको दो तिथियों के बीच महीनों का अंतर मिलेगा, दिनों की अनदेखी।
गणितीय और त्वरित दो दृष्टिकोण हैं, लेकिन कैलेंडर में योनि के अधीन हैं, या पुनरावृत्त और धीमे हैं, लेकिन सभी विषमताओं को संभालते हैं (या कम से कम प्रतिनिधियों को अच्छी तरह से परीक्षण किए गए पुस्तकालय के लिए संभालते हैं)।
यदि आप कैलेंडर के माध्यम से पुनरावृत्ति करते हैं, तो एक महीने की शुरुआत की तारीख बढ़ाएँ और देखें कि क्या हम अंतिम तिथि को पास करते हैं। यह निर्मित तिथि () कक्षाओं में विसंगति से निपटने को दर्शाता है, लेकिन धीमी गति से हो सकता है यदि आप बड़ी संख्या में तारीखों के लिए ऐसा कर रहे हैं। जेम्स का जवाब यह दृष्टिकोण लेता है। जितना मैं इस विचार को नापसंद करता हूं, मुझे लगता है कि यह "सबसे सुरक्षित" दृष्टिकोण है, और यदि आप केवल एक गणना कर रहे हैं , तो प्रदर्शन अंतर वास्तव में नगण्य है। हम उन कार्यों को ओवर-ऑप्टिमाइज़ करने का प्रयास करते हैं जो केवल एक बार ही किए जाएंगे।
अब, यदि आप किसी डेटासेट पर इस फ़ंक्शन की गणना कर रहे हैं , तो आप संभवतः उस फ़ंक्शन को प्रत्येक पंक्ति पर (या प्रति रिकॉर्ड कई बार, भगवान ना करें) चलाना नहीं चाहते हैं। उस स्थिति में, आप स्वीकृत उत्तर को छोड़कर यहां किसी भी अन्य उत्तर का उपयोग कर सकते हैं , जो कि सिर्फ गलत है ( 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;
}
यहां आप कम लूपिंग के साथ अन्य दृष्टिकोण पर जाते हैं:
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;
}
आप इस समाधान पर भी विचार कर सकते हैं, यह 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);
दो तिथियों के बीच अंतर की गणना महीने (दिन) के अंश शामिल हैं।
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 (महीने)
यह ठीक काम करना चाहिए:
function monthDiff(d1, d2) {
var months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months += d2.getMonth() - d1.getMonth();
return months;
}
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);
}
निम्नलिखित कोड आंशिक तारीखों के दिनों को ध्यान में रखते हुए दो तारीखों के बीच पूरे महीने का रिटर्न देते हैं।
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
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;
}
नीचे दिए गए तर्क महीनों में अंतर लाएंगे
(endDate.getFullYear()*12+endDate.getMonth())-(startDate.getFullYear()*12+startDate.getMonth())
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;
}
देखें कि मैं क्या उपयोग करता हूं:
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;
}
यह दिनों को भी गिनता है और महीनों में बदल देता है।
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
इस मामले में, मुझे पूरे महीने, भाग के महीनों, एक महीने में कितना समय है आदि से संबंधित नहीं है, मुझे सिर्फ महीनों की संख्या जानने की आवश्यकता है। एक प्रासंगिक वास्तविक विश्व मामला वह होगा जहां हर महीने एक रिपोर्ट होने वाली है, और मुझे यह जानना होगा कि वहाँ कितनी रिपोर्ट होनी चाहिए।
उदाहरण:
यह दिखाने के लिए एक विस्तृत कोड उदाहरण है जहाँ संख्याएँ जा रही हैं।
चलो 2 टाइमस्टैम्प लेते हैं जिसका परिणाम 4 महीने में होना चाहिए
अपने समयक्षेत्र / खींचे गए समय के साथ थोड़ा अलग हो सकता है। दिन, मिनट और सेकंड मायने नहीं रखते हैं और टाइमस्टैम्प में शामिल किया जा सकता है, लेकिन हम इसे अपनी वास्तविक गणना के साथ अवहेलना करेंगे।
let dateRangeStartConverted = new Date(1573621200000);
let dateRangeEndConverted = new Date(1582261140000);
let startingMonth = dateRangeStartConverted.getMonth();
let startingYear = dateRangeStartConverted.getFullYear();
let endingMonth = dateRangeEndConverted.getMonth();
let endingYear = dateRangeEndConverted.getFullYear();
यह हमें देता है
(12 * (endYear - startYear)) + 1
समाप्त होने वाले महीने में जोड़ें ।2 + (12 * (2020 - 2019)) + 1 = 15
15 - 11 = 4
; हमें अपना 4 महीने का परिणाम मिलता है।
नवंबर 2019 मार्च 2022 तक 29 महीने है। यदि आप इन्हें एक्सेल स्प्रेडशीट में रखते हैं, तो आपको 29 पंक्तियाँ दिखाई देंगी।
3 + (12 * (2022-2019)) + 1
40 - 11 = 29
anyVar = (((DisplayTo.getFullYear() * 12) + DisplayTo.getMonth()) - ((DisplayFrom.getFullYear() * 12) + DisplayFrom.getMonth()));
एक दृष्टिकोण एक सरल जावा वेब सेवा (REST / JSON) लिखना होगा जो Joda लाइब्रेरी का उपयोग करता है
http://joda-time.sourceforge.net/faq.html#datediff
दो तारीखों के बीच अंतर की गणना करने और जावास्क्रिप्ट से उस सेवा को कॉल करने के लिए।
यह मानता है कि आपका बैक एंड जावा में है।