web-dev-qa-db-fra.com

Moment JS début et fin du mois donné

J'ai besoin de calculer une date JS donnée année = 2014 et mois = 9 (septembre 2014).

J'ai essayé ceci:

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());

Les deux journaux montrent:

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

La date de fin est correcte mais ... pourquoi la date de début ne l'est pas?

71
Fabio B.

C'est parce que endOf mute la valeur d'origine.

Citation pertinente:

Mute le moment d'origine en le plaçant à la fin d'une unité de temps.

Voici un exemple de fonction qui vous donne le résultat souhaité:

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 };
}

Références:

135
klyd

Lorsque vous utilisez .endOf(), vous faites muter l'objet sur lequel il a été appelé. startDate devient le 30 septembre.

Vous devriez utiliser .clone() pour en faire une copie au lieu de la changer.

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) 
15
bakkal

vous pouvez l'utiliser directement pour la date de fin ou de début du mois

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

vous pouvez changer le format en définissant un nouveau format

7
Shakti Jadon

Essayez le code suivant:

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

Ne pensez pas vraiment qu'il existe une méthode directe pour obtenir le dernier jour, mais vous pouvez faire quelque chose comme ceci:

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
Sandeep Gantait

votre date de début est le premier jour du mois, dans ce cas, nous pouvons utiliser

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

J'espère que cela t'aides!!

1
nikhil
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;
}

Veuillez noter que .clone () est essentiel dans un moment, sinon il remplacera la valeur. Il semble que dans votre cas. 

C'est plus générique, pour obtenir un tas de dates qui se situent entre les dates.

0
bharat patel

Essayez le code suivant:

moment(startDate).startOf('months')
moment(startDate).endOf('months')
0
sacmii
var d = new moment();
var startMonth = d.clone().startOf('month');
var endMonth = d.clone().endOf('month');
console.log(startMonth, endMonth);

doc

0
IfThenElse

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
JSON C11