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?

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:


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


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) 

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

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

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


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

doc


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

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.


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

-2

Essayez le code suivant:

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.