दिए गए महीने की शुरुआत और अंत


94

मुझे वर्ष = 2014 और महीने = 9 (सितंबर 2014) को दिए गए जेएस तिथि की गणना करने की आवश्यकता है।

मैंने यह कोशिश की:

var moment = require('moment');
var startDate = moment( year+'-'+month+'-'+01 + ' 00:00:00' );
            var endDate = startDate.endOf('month');
            console.log(startDate.toDate());
            console.log(endDate.toDate());

दोनों लॉग दिखाते हैं:

Tue Sep 30 2014 23:59:59 GMT+0200 (CEST)
Tue Sep 30 2014 23:59:59 GMT+0200 (CEST)

अंतिम तिथि सही है लेकिन ... प्रारंभ तिथि क्यों नहीं है?

जवाबों:


178

ऐसा इसलिए है क्योंकि endOfमूल मूल्य को बदल देता है।

प्रासंगिक बोली:

मूल समय को एक इकाई के अंत में सेट करके म्यूट करता है।

यहां एक उदाहरण फ़ंक्शन है जो आपको इच्छित आउटपुट देता है:

function getMonthDateRange(year, month) {
    var moment = require('moment');

    // month in moment is 0 based, so 9 is actually october, subtract 1 to compensate
    // array is 'year', 'month', 'day', etc
    var startDate = moment([year, month - 1]);

    // Clone the value before .endOf()
    var endDate = moment(startDate).endOf('month');

    // just for demonstration:
    console.log(startDate.toDate());
    console.log(endDate.toDate());

    // make sure to call toDate() for plain JavaScript date type
    return { start: startDate, end: endDate };
}

संदर्भ:


4
momentआप का उपयोग कर सकते हैं तो सुखद है endDate = moment(starDate).endOf("month") ^ ^। ^
धन्यवाद

1
बिल्कुल, वास्तव में प्रलेखन में किसी वस्तु को क्लोन करने का डिफ़ॉल्ट तरीका है moment(<value>)। कुछ छोटे कार्यों का उपयोग करने के लिए उदाहरण को अपडेट किया।
क्लेड

1
धन्यवाद। मैंने दो घंटे बिताकर यह पता लगाने की कोशिश की कि यह काम क्यों नहीं कर रहा है।
लियोन

1
पहली बार मैंने वेब पर प्रयोग किया गया शब्द कभी नहीं देखा है !! अच्छी तरह से किया naomik
माइक

add(-1,"month")काम नहीं करता है जब इसकी जनवरी और आप पिछले वर्ष का महीना प्राप्त करना चाहते हैं।
अखोय

20

आप इसे महीने के अंत या आरंभ तिथि के लिए सीधे उपयोग कर सकते हैं

new moment().startOf('month').format("YYYY-DD-MM");
new moment().endOf("month").format("YYYY-DD-MM");

आप एक नए प्रारूप को परिभाषित करके प्रारूप को बदल सकते हैं


16

जब आप इसका उपयोग .endOf()करते हैं तो यह उस वस्तु को म्यूट कर रहा होता है, जिस पर startDateवह 30 सितंबर को बन जाता है

आपको .clone()इसे बदलने के बजाय इसकी प्रतिलिपि बनाने के लिए उपयोग करना चाहिए

var startDate = moment(year + '-' + month + '-' + 01 + ' 00:00:00');
            var endDate = startDate.clone().endOf('month');
            console.log(startDate.toDate());
            console.log(endDate.toDate());

Mon Sep 01 2014 00:00:00 GMT+0700 (ICT) 
Tue Sep 30 2014 23:59:59 GMT+0700 (ICT) 

5

निम्नलिखित कोड का प्रयास करें:

const moment=require('moment');
console.log("startDate=>",moment().startOf('month').format("YYYY-DD-MM"));
console.log("endDate=>",moment().endOf('month').format("YYYY-DD-MM"));

1
आपको यह समझाने के लिए अपने कोड के साथ कुछ संदर्भ जोड़ना चाहिए कि यह समस्या क्यों और कैसे हल करेगा
'

3

वास्तव में नहीं लगता कि अंतिम दिन प्राप्त करने के लिए कुछ प्रत्यक्ष विधि है, लेकिन आप कुछ इस तरह से कर सकते हैं:

var dateInst = new moment();
/**
 * adding 1 month from the present month and then subtracting 1 day, 
 * So you would get the last day of this month 
 */
dateInst.add(1, 'months').date(1).subtract(1, 'days');
/* printing the last day of this month's date */
console.log(dateInst.format('YYYY MM DD'));

2

आपका आरंभ महीने का पहला दिन है, इस मामले में हम उपयोग कर सकते हैं

var endDate = moment(startDate).add(1, 'months').subtract(1, 'days');

उम्मीद है की यह मदद करेगा!!



0

const year = 2014;
const month = 09;

// months start at index 0 in momentjs, so we subtract 1
const startDate = moment([year, month - 1, 01]).format("YYYY-MM-DD");

// get the number of days for this month
const daysInMonth = moment(startDate).daysInMonth();

// we are adding the days in this month to the start date (minus the first day)
const endDate = moment(startDate).add(daysInMonth - 1, 'days').format("YYYY-MM-DD");

console.log(`start date: ${startDate}`);
console.log(`end date:   ${endDate}`);
<script
src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>


0
const dates = getDatesFromDateRange("2014-05-02", "2018-05-12", "YYYY/MM/DD", 1);           
console.log(dates);
// you get the whole from-to date ranges as per parameters
var onlyStartDates = dates.map(dateObj => dateObj["to"]);
console.log(onlyStartDates);
// moreover, if you want only from dates then you can grab by "map" function

function getDatesFromDateRange( startDate, endDate, format, counter ) {
    startDate = moment(startDate, format);
    endDate = moment(endDate, format);

    let dates = [];
    let fromDate = startDate.clone();
    let toDate = fromDate.clone().add(counter, "month").startOf("month").add(-1, "day");
    do {
        dates.push({
            "from": fromDate.format(format),
            "to": ( toDate < endDate ) ? toDate.format(format) : endDate.format(format)
        });
        fromDate = moment(toDate, format).add(1, "day").clone();
        toDate = fromDate.clone().add(counter, "month").startOf("month").add(-1, "day");
    } while ( fromDate < endDate );
    return dates;
}

कृपया ध्यान दें, .clone () क्षणों में आवश्यक है अन्यथा यह मान को ओवरराइड कर देगा। यह आपके मामले में लगता है।

यह अधिक सामान्य है, तिथियों का गुच्छा प्राप्त करना जो तिथियों के बीच आते हैं।


-1

निम्नलिखित कोड काम करना चाहिए:

$('#reportrange').daterangepicker({
                startDate: start,
                endDate: end,
                ranges: {
                    'Hoy': [moment(), moment()],
                    'Ayer': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                    'Ultimos 7 dias': [moment().subtract(6, 'days'), moment()],
                    'Ultimos 30 dias': [moment().subtract(29, 'days'), moment()],
                    'Mes actual': [moment().startOf('month'), moment().endOf('month')],
                    'Ultimo mes': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
                    'Enero': [moment().month(0).startOf('month') , moment().month(0).endOf('month')],
                    'Febrero': [moment().month(1).startOf('month') , moment().month(1).endOf('month')],
                    'Marzo': [moment().month(2).startOf('month') , moment().month(2).endOf('month')],
                    'Abril': [moment().month(3).startOf('month') , moment().month(3).endOf('month')],
                    'Mayo': [moment().month(4).startOf('month') , moment().month(4).endOf('month')],
                    'Junio': [moment().month(5).startOf('month') , moment().month(5).endOf('month')],
                    'Julio': [moment().month(6).startOf('month') , moment().month(6).endOf('month')],
                    'Agosto': [moment().month(7).startOf('month') , moment().month(7).endOf('month')],
                    'Septiembre': [moment().month(8).startOf('month') , moment().month(8).endOf('month')],
                    'Octubre': [moment().month(9).startOf('month') , moment().month(9).endOf('month')],
                    'Noviembre': [moment().month(10).startOf('month') , moment().month(10).endOf('month')],
                    'Diciembre': [moment().month(11).startOf('month') , moment().month(11).endOf('month')]
                }
            }, cb);

-2

निम्नलिखित कोड का प्रयास करें:

moment(startDate).startOf('months')
moment(startDate).endOf('months')

2
ढेर अतिप्रवाह में आपका स्वागत है। इस प्रश्न के दस अन्य उत्तर हैं; यह बताना आपके लिए अच्छा होगा कि आपका दूसरों की तुलना में बेहतर या बेहतर क्यों है।
chb

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