Moment JS début et fin du mois donné

94

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?

Fabio B.
la source

Réponses:

178

C'est parce que endOfmute 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:

Klyd
la source
4
momentest idempotent donc vous pouvez également utiliser endDate = moment(starDate).endOf("month") ^. ^
Merci
1
Absolument, en fait, la méthode par défaut pour cloner un objet dans la documentation est moment(<value>). Mise à jour de l'exemple pour utiliser certaines des fonctions plus courtes.
klyd
1
Je vous remercie. J'ai passé deux heures à essayer de comprendre pourquoi cela ne fonctionnait pas.
Leon
1
première fois que j'ai vu le mot idempotent utilisé sur le web !! bravo naomik
Mike
add(-1,"month")ne fonctionne pas quand son janvier et vous voulez obtenir le mois de l'année dernière.
Akhoy
20

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

Shakti Jadon
la source
16

Lorsque vous utilisez, .endOf()vous faites muter l'objet sur lequel il est appelé, doncstartDate devient 30 septembre

Vous devriez utiliser .clone()pour en faire une copie au lieu de le 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) 
Bakkal
la source
5

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"));
Sanjay Singh
la source
1
vous devriez ajouter un peu de contexte avec votre code pour expliquer pourquoi et comment il résoudra le problème
ᴄʀᴏᴢᴇᴛ
3

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'));
Sandeep Gantait
la source
2

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!!

nikhil
la source
0
var d = new moment();
var startMonth = d.clone().startOf('month');
var endMonth = d.clone().endOf('month');
console.log(startMonth, endMonth);

doc

IfThenElse
la source
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>

JSON C11
la source
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;
}

Veuillez noter que .clone () est essentiel dans momentjs sinon il remplacera la valeur. Cela semble dans votre cas.

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

bharat patel
la source
-1

Le code suivant devrait fonctionner:

$('#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);
enrique ramos
la source
-2

Essayez le code suivant:

moment(startDate).startOf('months')
moment(startDate).endOf('months')
sacmii
la source
2
Bienvenue dans Stack Overflow. Il y a dix autres réponses à cette question; il serait bon que vous expliquiez pourquoi le vôtre est meilleur ou préférable aux autres.
chb
il ne donne pas les o / p attendus
Shyam