web-dev-qa-db-fra.com

Comment obtenir la liste des jours du mois avec Moment.js

Utilisation de Moment.js, je voudrais obtenir tous les jours dans un mois de l'année spécifique dans un tableau. Par exemple:

January-2014:
[
"01-wed",
"02-thr",
"03-fri",
"04-sat"
]

aucune suggestion? J'ai parcouru la documentation Moment.js mais je n'ai rien trouvé. Le placard que j'ai eu était ceci: 

moment("2012-02", "YYYY-MM").daysInMonth() 

Mais cela ne renvoie qu'un entier avec le nombre total de jours pour un mois spécifique et non un tableau avec chaque jour.

19
ecorvo

Voici une fonction qui fera l'affaire (ne pas utiliser Moment, mais simplement le code JavaScript Vanilla):

var getDaysArray = function(year, month) {
  var names = [ 'Sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ];
  var date = new Date(year, month - 1, 1);
  var result = [];
  while (date.getMonth() == month - 1) {
    result.Push(date.getDate() + "-" + names[date.getDay()]);
    date.setDate(date.getDate() + 1);
  }
  return result;
}

Par exemple:

js> getDaysArray(2012,2)
["1-wed", "2-thu", "3-fri", "4-sat", "5-Sun", "6-mon", "7-tue",
 "8-wed", "9-thu", "10-fri", "11-sat", "12-Sun", "13-mon", "14-tue",
"15-wed", "16-thu", "17-fri", "18-sat", "19-Sun", "20-mon", "21-tue", 
"22-wed", "23-thu", "24-fri", "25-sat", "26-Sun", "27-mon", "28-tue",
"29-wed"]

Version ES2015 +:

const getDaysArray = (year, month) => {
  const names = Object.freeze(
     [ 'Sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]);
  const date = new Date(year, month - 1, 1);
  const result = [];
  while (date.getMonth() == month - 1) {
    result.Push(`${date.getDate()}-${names[date.getDay()]}`);
    date.setDate(date.getDate() + 1);
  }
  return result;
}

Notez que les solutions ci-dessus ne définissent pas les dates zéro avant le 10, contrairement à l'exemple de sortie inclus dans la question. Avec ES2017 +, c'est très facile à corriger: 

    result.Push(`${date.getDate()}`.padStart(2,'0') + `-${names[date.getDay()]}`);

Pour le faire dans les anciennes versions de JS, vous devez utiliser votre propre logique de remplissage zéro, ce qui n’est pas difficile, mais n’est pas vraiment au centre de la question.

36
Mark Reed

Alternative avec momentjs, travaillant pour moi 

function getDaysArrayByMonth() {
  var daysInMonth = moment().daysInMonth();
  var arrDays = [];

  while(daysInMonth) {
    var current = moment().date(daysInMonth);
    arrDays.Push(current);
    daysInMonth--;
  }

  return arrDays;
}

Et vous pouvez vérifier

var schedule = getDaysArrayByMonth();
schedule.forEach(function(item) {
  console.log(item.format("DD/MM"));
});
9
victorkurauchi

Utiliser aussi lodash_.times :

var daysInMonth = [];

var monthDate = moment().startOf('month'); // change to a date in the month of interest

_.times(monthDate.daysInMonth(), function (n) {
     daysInMonth.Push(monthDate.format('D'));  // your format
     monthDate.add(1, 'day');
});
9
vinjenzo

Voici deux approches fonctionnelles de Nice sans dépendance externe autre que Moment:

const currentMonthDates = new Array(moment().daysInMonth()).fill(null).map((x, i) => moment().startOf('month').add(i, 'days'));
const currentMonthDates = Array.from({length: moment().daysInMonth()}, (x, i) => moment().startOf('month').add(i, 'days'));

Cela retourne un tableau d'objets Moment, vous pouvez ensuite exécuter la méthode de formatage souhaitée.

A lire ultérieurement Création et remplissage de tableaux de longueurs arbitraires en JavaScript , notez également que dans le premier exemple, vous devez remplir le tableau avec null avant de le mapper, car il est toujours classé comme vide fonction de la carte ne serait pas exécuté.

1
tomhughes

Sinon, vous pouvez maintenant utiliser plage de moments pour y parvenir:

const month = moment('2012-02', 'YYYY-MM');
const range = moment().range(moment(month).startOf('month'), moment(month).endOf('month'));
const days = range.by('days');

console.log([...days].map(date => date.format('DD-ddd')));
1
nicolas

Pour obtenir des jours dans un mois avec moment.js, j'utilise celui-ci:

  function daysInMonth(month) {
    var count =  moment().month(month).daysInMonth();
    var days = [];
    for (var i = 1; i < count+1; i++) {
      days.Push(moment().month(month).date(i));
    }
    return days;
  }

Puis appeler la fonction

var days = daysInMonth( moment().month() );
0
mchev