जावास्क्रिप्ट में महीने के अंतिम दिन की गणना करें


277

प्रदान की जाती है 0के रूप में dayValueमें Date.setFullYearआप पिछले महीने के अंतिम दिन मिलता है:

d = new Date(); d.setFullYear(2008, 11, 0); //  Sun Nov 30 2008

मोज़िला में इस व्यवहार का संदर्भ है । क्या यह एक विश्वसनीय क्रॉस-ब्राउज़र सुविधा है या मुझे वैकल्पिक तरीकों को देखना चाहिए?


क्या आपका मतलब महीने के आखिरी दिन से नहीं है? नवंबर में 30 दिन और अक्टूबर में 31 दिन हैं।
क्रिस सेरा

16
महीने जावास्क्रिप्ट में शून्य आधारित होते हैं इसलिए 11 दिसंबर है
ग्रेग

2
@ TheCloudlessSky - इसे अपने कंसोल में आज़माएं ... (2008,11,0) दिसंबर का शून्य-वें दिन है, और इसलिए नवंबर का अंतिम दिन
केन

@Ken - हाँ - मुझे एहसास नहीं था कि वहाँ एक "0" था:) ... यह सुबह बहुत जल्दी था।
TheCloudlessSky

जवाबों:


424
var month = 0; // January
var d = new Date(2008, month + 1, 0);
alert(d); // last day in January

IE 6:                     Thu Jan 31 00:00:00 CST 2008
IE 7:                     Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2:             Thu Jan 31 00:00:00 CST 2008
Opera 8.54:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60:               Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17:         Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3:            Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)

आउटपुट अंतर toString()कार्यान्वयन में अंतर के कारण होता है , न कि इसलिए क्योंकि दिनांक अलग-अलग होते हैं।

बेशक, सिर्फ इसलिए कि ऊपर पहचाने गए ब्राउज़र पिछले महीने के आखिरी दिन के रूप में 0 का उपयोग करते हैं, इसका मतलब यह नहीं है कि वे ऐसा करना जारी रखेंगे, या सूचीबद्ध ब्राउज़र ऐसा नहीं करेंगे, लेकिन यह इस विश्वास को विश्वसनीयता प्रदान करता है कि इसे काम करना चाहिए इसी तरह से हर ब्राउज़र में।


19
यह पूरी तरह से अच्छी तरह से काम करने लगता है। जिज्ञासा से बाहर, आप इन सभी इंजनों पर जावास्क्रिप्ट चलाने के लिए क्या उपयोग कर रहे हैं? सब कुछ सेट-अप या किसी प्रकार का टूल मिला?
नॉनस्की

5
वास्तविक दिन पाने के लिए आप d.getDate () का उपयोग कर सकते हैं।
रिनोप

35
"सिर्फ इसलिए कि ब्राउज़र ... पिछले महीने के अंतिम दिन के रूप में 0 का उपयोग करें इसका मतलब यह नहीं है कि वे ऐसा करना जारी रखेंगे"। हाँ, ऐसा होता है, उन्हें ECMA-262 द्वारा ऐसा करना आवश्यक है।
रॉब

3
कृपया ध्यान दें कि अन्य गणना विधियों की तुलना में new Dateयह इतना धीमा है कि यह सही चार्ट पर भी नहीं दिखता है
'Coding

4
यह मेरे लिए Chrome 48.0.2564.116 पर काम नहीं करता है। शायद, इस तरह से यह 'मानक' होने से बंद हो गया है।
xarlymg89

77

मैं अगले महीने के पहले दिन के साथ एक मध्यवर्ती तिथि का उपयोग करूंगा, और पिछले दिन से तारीख वापस करूंगा:

int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);

ECMAScript विनिर्देशन के अनुसार , "तिथि" कंस्ट्रक्टर का उपयोग करना जैसा आपने बताया कि वैध है। "MakeDay" फ़ंक्शन द्वारा निर्दिष्ट एल्गोरिथ्म का पालन करते हुए, इसे समस्या को अच्छी तरह से संभालना चाहिए।
पाब्लो कैबरेरा

1
यह सबसे अच्छा समाधान IMO है। मैंने स्वीकार किए गए उत्तर की कोशिश की लेकिन चालू माह के आखिरी में लाने पर इसमें कुछ बग हैं। यह आज की तारीख में लौटता है। यकीन नहीं होता कि ऐसा क्यों होता है।
गोगोल

1
मैं बग को दोहरा नहीं सकता। यह मुझे सभी ब्राउज़रों में सही तारीख देता है:today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
orad

यह महीने के अंतिम दिन के लिए एक तिथि वस्तु बनाता है जिसमें अंतिम मिलीसेकंड (यानी 23: 59: 59.999) निर्धारित समय होता है। ओपी में केवल विधि का उपयोग करने के लिए बेहतर है और अतिरिक्त चरण और दिनांक ऑब्जेक्ट को सहेजें।
रॉब

@ रोब: मैं सहमत हूँ! हालांकि मेरे समाधान को समझना आसान हो सकता है, क्योंकि महीने के अंतिम दिन के लिए 0 का उपयोग करने की धारणा मेरी राय में थोड़ी भद्दी लगती है।
कार्लपोपिन

72

मुझे यह मेरे लिए सबसे अच्छा समाधान लगता है। दिनांक ऑब्जेक्ट को आपके लिए इसकी गणना करने दें।

var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);

दिन के पैरामीटर को 0 पर सेट करने का मतलब महीने के पहले दिन से कम है, जो पिछले महीने का आखिरी दिन है।


1
यह ठीक है, मैंने देखा कि चयनित उत्तर उसी का सुझाव दे रहा है। यह सबसे तेज और सबसे विश्वसनीय तरीका है और कैलेंडर के प्रकार की परवाह किए बिना काम करता है। उदाहरण के लिए यदि दिनांक ग्रेगोरियन कैलेंडर के अलावा कुछ और लागू होता है तो भी यह काम करेगा। तारीख ऑब्जेक्ट के गैर-ग्रेगोरियन कार्यान्वयन के एक उदाहरण के लिए intldate.codeplex.com देखें ।
ओराड

1
@ोराद: कुछ दावा करने से सावधान रहें "सबसे तेज़ है" क्योंकि यह विधि वास्तव में कुछ विकल्पों की तुलना में काफी धीमी है। का उपयोग करना new Dateहै तो बहुत धीमी यह भी पर्फ़ चार्ट पर दिखाई नहीं देता : jsperf.com/days-in-month-perf-test/6
कोडिंग चला गया

@TrueBlueAussie ठीक है। मैंने यह मान लिया था कि यह तेज था क्योंकि यह मूल निवासी था। लेकिन आप सही हैं, यह तेज़ नहीं है। वास्तव में इसका परीक्षण करने के लिए धन्यवाद। वैसे भी, यह समाधान मेरे लिए सबसे अच्छा काम करता है क्योंकि यह संक्षिप्त और पठनीय है और अन्य सभी समाधानों के विपरीत ग्रेगोरियन कैलेंडर के लिए बाध्य नहीं है।
orad

"अन्य सभी समाधानों के विपरीत ग्रेगोरियन कैलेंडर के लिए बाध्य नहीं है" !!! यह एल्गोरिथ्म 1-4000 वर्षों के लिए मेरा मान देता है। jsfiddle.net/2973x9m3/3 जो अतिरिक्त तिथि सीमा आप दावा कर रहे हैं कि यह समर्थन करेगा (जो उपयोग का होगा)? :)
कोडिंग हुई

1
मूल निवासी जेएस दिनांक केवल ग्रेगोरियन कैलेंडर का उपयोग करता है। लेकिन आप इसे अन्य कैलेंडर प्रकारों को प्राप्त करने के लिए कुछ अन्य कार्यान्वयन के साथ मॉक कर सकते हैं। उदाहरण के लिए IntlDate देखें । यदि आपके पास एक तारीख लेने वाला है जो मासिक विचारों को बनाने के लिए दिनांक वस्तुओं का उपयोग करता है, तो यह ध्यान नहीं देता है कि कौन सा दिनांक कार्यान्वयन (मूल या नकली) तब तक उपयोग कर रहा है जब तक कि उनके पास एक ही इंटरफ़ेस है। इसलिए एक साझा इंटरफ़ेस का उपयोग करने से विभिन्न कैलेंडर प्रकारों के बीच स्विच करने की अनुमति मिलती है, बिना यह जाने कि प्रत्येक कैलेंडर पर एक महीने में कितने दिन हैं।
orad

25

कंप्यूटर के संदर्भ में, new Date()और regular expressionसमाधान धीमे हैं! आप एक सुपर फास्ट (और सुपर गुप्त) एक लाइनर चाहते हैं, (यह मानते हुए एक कोशिश mमें है Jan=1प्रारूप)। मैं सर्वश्रेष्ठ प्रदर्शन पाने के लिए विभिन्न कोड परिवर्तनों की कोशिश करता रहता हूं।

मेरा वर्तमान सबसे तेज़ संस्करण:

इस संबंधित प्रश्न को देखने के बाद बिटवेट ऑपरेटर्स (अद्भुत गति) का उपयोग करके चेक करें और 25 और 15 मैजिक नंबर का प्रतिनिधित्व करने के बारे में पता लगाएं, मैं उत्तर के इस अनुकूलित हाइब्रिड के साथ आया हूं:

function getDaysInMonth(m, y) {
    return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}

बिट-शिफ्टिंग को देखते हुए यह स्पष्ट रूप से माना जाता है कि आपके mऔर yपैरामीटर दोनों पूर्णांक हैं, क्योंकि स्ट्रिंग्स के रूप में पासिंग संख्या अजीब परिणाम होगी।

JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/

JSPerf परिणाम: http://jsperf.com/days-in-month-head-to-head/5

किसी कारण से, (m+(m>>3)&1)से अधिक कुशल है (5546>>m&1)पर लगभग सभी ब्राउज़रों।

गति के लिए एकमात्र वास्तविक प्रतियोगिता @ गीतालैब से है, इसलिए मैंने परीक्षण करने के लिए एक हेड-टू-हेड JSPerf बनाया है: http://jsperf.com/days-in-month-head-to-head/5


यह मेरे लीप ईयर उत्तर के आधार पर यहां काम करता है: लीप ईयर खोजने के लिए जावास्क्रिप्ट इस उत्तर में यहां लीप ईयर की जांच बिटवाइज ऑपरेटरों (आश्चर्यजनक गति) के साथ-साथ निम्नलिखित द्विआधारी तर्क का उपयोग करके की गई है।

बाइनरी महीनों में एक त्वरित पाठ:

यदि आप बाइनरी में वांछित महीनों (जनवरी = 1) के सूचकांक की व्याख्या करते हैं, तो आप देखेंगे कि 31 दिनों के महीनों में बिट 3 स्पष्ट और बिट 0 सेट या बिट 3 सेट और बिट 0 स्पष्ट हैं।

Jan = 1  = 0001 : 31 days
Feb = 2  = 0010
Mar = 3  = 0011 : 31 days
Apr = 4  = 0100
May = 5  = 0101 : 31 days
Jun = 6  = 0110
Jul = 7  = 0111 : 31 days
Aug = 8  = 1000 : 31 days
Sep = 9  = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days

इसका मतलब है कि आप मान के साथ 3 स्थानों को स्थानांतरित कर सकते हैं >> 3, मूल के साथ बिट्स को XOR कर सकते हैं ^ mऔर देखें कि क्या परिणाम है 1या 0 बिट स्थिति 0 का उपयोग कर रहा है & 1। नोट: यह +XOR ( ^) की तुलना में थोड़ा तेज है और (m >> 3) + mबिट 0 में समान परिणाम देता है।

JSPerf परिणाम : http://jsperf.com/days-in-month-perf-test/6


मूल अहंकार और पूरा इतिहास (टिप्पणियां देखें): stackoverflow.com/questions/1810984/number-of-days-in-any-month/… इसके बाद stackoverflow.com/questions/1810984/number-of-days-in-any
-मौत

1
@ गीतालीब: आपको पहले ही एक उल्लेख मिल गया था और यह कभी भी आपके जैसा नहीं था, जैसा कि आप अच्छी तरह से जानते हैं। एक दूसरे के एल्गोरिदम का वृद्धिशील अद्यतन "मूल अहंकार" के समान नहीं है। पी: मैं इस सवाल का जवाब भी में प्रयास के एक बहुत डाल
कोडिंग चला गया

@TrueBlueAussie: मैं केवल भविष्य के पाठकों को अधिक जानकारी के हमारे खजाने की ओर संकेत करना चाहता था (मैंने अपने दोनों उत्तरों को लिंक किया ताकि जो कोई भी परवाह करता है या कोई अन्य लेना चाहता है वह हमारे संपादन-इतिहास को देख सकता है कि हम क्या और क्यों देख सकते हैं )। मैं अभी भी प्रतिस्पर्धा के हमारे पूरे दिन को याद करता हूं! :)मेरे द्वारा पोस्ट किया गया पहला पहला उत्तर-संस्करण वास्तव में ब्रैकेट्स का एक अनावश्यक सेट था, जिसे हटा दिया गया था (जिसके लिए मैंने आपको श्रेय दिया था) ताकि हम एक चरित्र का शेव कर सकें और इस एक के साथ समाप्त हो सकें। मैं अभी भी उस मजेदार दिन के लिए आभारी हूँ, खुश हो जाओ!
गीतरलैब

1
कृपया उल्लेख करें कि yऔर mचर को पूर्णांक होना है न कि स्ट्रिंग! उदाहरण के लिए यह गलत गणना का कारण बनता है फरवरी के लिए यह 30 देता है। मुझे parseInt()इसे काम करने के लिए फ़ंक्शन का उपयोग करना पड़ा ।
बजाय

21

मेरे सहयोगी ने निम्नलिखित पर ठोकर खाई जो एक आसान समाधान हो सकता है

function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}

http://snippets.dzone.com/posts/show/2099 से चोरी


2
निगेल ने इसे और भी संक्षिप्त समाधान में बदल दिया। उनकी पोस्ट देखें।
1

महीना शून्य-आधारित है, अर्थात, जनवरी = 0. समान रूप से getMonth ()।
मूस

16

Lebreeze द्वारा प्रदान किए गए समाधान के लिए एक मामूली संशोधन :

function daysInMonth(iMonth, iYear)
{
    return new Date(iYear, iMonth, 0).getDate();
}

यह return new Date(iYear, 1 + iMonth, 0).getDate();@ लेब्रीज के घोल के बराबर होना चाहिए ।
मूस

6

मुझे हाल ही में कुछ ऐसा ही करना पड़ा, यही मैं साथ आया हूँ:

/**
* Returns a date set to the begining of the month
* 
* @param {Date} myDate 
* @returns {Date}
*/
function beginningOfMonth(myDate){    
  let date = new Date(myDate);
  date.setDate(1)
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);   
  return date;     
}

/**
 * Returns a date set to the end of the month
 * 
 * @param {Date} myDate 
 * @returns {Date}
 */
function endOfMonth(myDate){
  let date = new Date(myDate);
  date.setMonth(date.getMonth() +1)
  date.setDate(0);
  date.setHours(23);
  date.setMinutes(59);
  date.setSeconds(59);
  return date;
}

इसे एक तारीख में पास करें, और यह महीने की शुरुआत या महीने के अंत में सेट की गई तारीख को लौटा देगा।

begninngOfMonthसमारोह काफी आत्म व्याख्यात्मक है, लेकिन क्या में में हो रहा है endOfMonthसमारोह है कि मैं अगले महीने के लिए महीने के incrementing कर रहा हूँ, और फिर उपयोग कर रहा है setDate(0)पिछले महीने के अंतिम दिन जो का एक हिस्सा है करने के लिए दिन में रोल बैक करना सेट करें कल्पना:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref/setdate.asp

फिर मैं दिन के अंत में घंटे / मिनट / सेकंड सेट करता हूं, ताकि यदि आप किसी प्रकार की एपीआई का उपयोग कर रहे हैं जो कि एक तिथि सीमा की उम्मीद कर रहा है तो आप उस अंतिम दिन की संपूर्णता पर कब्जा कर पाएंगे। यह भाग मूल पद के लिए क्या कह रहा है उससे आगे जा सकता है लेकिन यह किसी और को इसी तरह के समाधान की तलाश में मदद कर सकता है।

संपादित करें: setMilliseconds()यदि आप अतिरिक्त सटीक होना चाहते हैं तो आप अतिरिक्त मील भी जा सकते हैं और मिलीसेकंड सेट कर सकते हैं।


4

इसको आजमाओ।

lastDateofTheMonth = new Date(year, month, 0)

उदाहरण:

new Date(2012, 8, 0)

उत्पादन:

Date {Fri Aug 31 2012 00:00:00 GMT+0900 (Tokyo Standard Time)}

5
याद रखें, हालांकि, वे महीने शून्य-आधारित हैं, इसलिए "8" महीना गुजर रहा है क्योंकि वास्तव में सितंबर है, अगस्त नहीं।
स्टीव जे

3

यह मेरे लिए काम करता है। दिए गए वर्ष के अंतिम दिन और महीने प्रदान करेगा:

var d = new Date(2012,02,0);
var n = d.getDate();
alert(n);

1
"2" के सामने 0 के साथ लापरवाह रहें, इसे अष्टक के रूप में व्याख्या किया जाएगा।
वालफ्रैट

1

यह अच्छी तरह से काम करता है:

Date.prototype.setToLastDateInMonth = function () {

    this.setDate(1);
    this.setMonth(this.getMonth() + 1);
    this.setDate(this.getDate() - 1);

    return this;
}

1

यह आपको चालू महीने का पहला और आखिरी दिन देगा।

यदि आपको 'वर्ष' को बदलने की आवश्यकता है तो d.getFullYear () को हटा दें और अपना वर्ष निर्धारित करें।

यदि आपको 'माह' को बदलने की आवश्यकता है तो d.getMonth () को हटा दें और अपना वर्ष निर्धारित करें।

var d = new Date();
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var fistDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth(), 1).getDay())];
	var LastDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth() + 1, 0).getDay())]; 
console.log("First Day :" + fistDayOfMonth); 
console.log("Last Day:" + LastDayOfMonth);
alert("First Day :" + fistDayOfMonth); 
alert("Last Day:" + LastDayOfMonth);


1

इसे इस्तेमाल करे:

function _getEndOfMonth(time_stamp) {
    let time = new Date(time_stamp * 1000);
    let month = time.getMonth() + 1;
    let year = time.getFullYear();
    let day = time.getDate();
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            day = 30;
            break;
        case 2:
            if (_leapyear(year))
                day = 29;
            else
                day = 28;
            break
    }
    let m = moment(`${year}-${month}-${day}`, 'YYYY-MM-DD')
    return m.unix() + constants.DAY - 1;
}

function _leapyear(year) {
    return (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
}

1

नीचे फ़ंक्शन महीने का अंतिम दिन देता है:

function getLstDayOfMonFnc(date) {
  return new Date(date.getFullYear(), date.getMonth(), 0).getDate()
}

console.log(getLstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 29
console.log(getLstDayOfMonFnc(new Date(2017, 2, 15))) // Output : 28
console.log(getLstDayOfMonFnc(new Date(2017, 11, 15))) // Output : 30
console.log(getLstDayOfMonFnc(new Date(2017, 12, 15))) // Output : 31

इसी तरह हम महीने का पहला दिन प्राप्त कर सकते हैं:

function getFstDayOfMonFnc(date) {
  return new Date(date.getFullYear(), date.getMonth(), 1).getDate()
}

console.log(getFstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 1


0
function getLastDay(y, m) {
   return 30 + (m <= 7 ? ((m % 2) ? 1 : 0) : (!(m % 2) ? 1 : 0)) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0)); 
}

0
const today = new Date();

let beginDate = new Date();

let endDate = new Date();

// fist date of montg

beginDate = new Date(

  `${today.getFullYear()}-${today.getMonth() + 1}-01 00:00:00`

);

// end date of month 

// set next Month first Date

endDate = new Date(

  `${today.getFullYear()}-${today.getMonth() + 2}-01 :23:59:59`

);

// deducting 1 day

endDate.setDate(0);

0

महीने सेट करने की आवश्यकता है और फिर दिन को शून्य पर सेट करें, इसलिए महीने की शुरुआत 1 से 31 तारीख के समारोह में करें फिर अंतिम दिन प्राप्त करें ^ ^

var last = new Date(new Date(new Date().setMonth(7)).setDate(0)).getDate();
console.log(last);


0

यहां एक उत्तर है जो जीएमटी और प्रारंभिक तिथि के समय का संरक्षण करता है

var date = new Date();

var first_date = new Date(date); //Make a copy of the date we want the first and last days from
first_date.setUTCDate(1); //Set the day as the first of the month

var last_date = new Date(first_date); //Make a copy of the calculated first day
last_date.setUTCMonth(last_date.getUTCMonth() + 1); //Add a month
last_date.setUTCDate(0); //Set the date to 0, this goes to the last day of the previous month

console.log(first_date.toJSON().substring(0, 10), last_date.toJSON().substring(0, 10)); //Log the dates with the format yyyy-mm-dd


0

मुझे पता है कि यह सिर्फ शब्दार्थ की बात है, लेकिन मैंने इसे इस रूप में उपयोग करना समाप्त कर दिया।

var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate();
console.log(lastDay);

चूंकि कार्यों को अंदर के तर्क से हल किया जाता है, बाहर की ओर, यह एक ही काम करता है।

फिर आप आवश्यक विवरण के साथ वर्ष, और माह / वर्ष को बदल सकते हैं, चाहे वह वर्तमान तिथि से हो। या एक विशेष माह / वर्ष।


0

यदि आपको महीने के अंत में मील के पत्थर की आवश्यकता होती है (उदाहरण के लिए टाइमस्टैम्प में):

d = new Date()
console.log(d.toString())
d.setDate(1)
d.setHours(23, 59, 59, 999)
d.setMonth(d.getMonth() + 1)
d.setDate(d.getDate() - 1)
console.log(d.toString())

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