151 votes

Commencer la semaine le lundi avec isoWeekday()

Je crée un calendrier où j'imprime les semaines dans un format tabulaire. Une exigence est que je sois capable de commencer les semaines soit le lundi soit le dimanche, selon une option de l'utilisateur. J'ai du mal à utiliser la méthode isoWeekday de moment.

// Début d'une certaine plage de dates. Peut être n'importe quel jour de la semaine.
var startOfPeriod = moment("2013-06-23T00:00:00"),

    // Nous commençons au début de la première semaine.
    // Lun Mar Mer Jeu Ven Sam Dim
    // 20  21   22  23   24  25  26
    begin = moment(startOfPeriod).isoWeekday(1); // sera déterminé par l'utilisateur

console.log(begin.isoWeekday()); // 1 - tout va bien

// Trouvons le début de cette première semaine, en respectant l'isoWeekday
begin.startOf('week');

console.log(begin.isoWeekday()); // 7 - que s'est-il passé ???

// Obtenir les en-têtes des colonnes
for (var i=0; i<7; i++) {
    console.log(begin.format('ddd')); // Je veux que le lundi soit en premier !
    begin.add('d', 1);
}

jsFiddle

MODIFICATION J'ai mal interprété ce que faisait la méthode isoWeekday. Je pensais qu'elle réglait la variable "quel jour de la semaine est le premier jour de la semaine" (qui n'existe pas). En fait, elle change simplement le jour de la semaine, tout comme moment.weekday(), mais utilise une plage de 1 à 7 au lieu de 0 à 6.

-2voto

Adam Reis Points 1174

Pour ceux qui souhaitent que isoWeek soit la valeur par défaut, vous pouvez modifier le comportement de moment comme suit:

const moment = require('moment');
const proto = Object.getPrototypeOf(moment());

const {startOf, endOf} = proto;
proto.startOf = function(period) {
  if (period === 'week') {
    period = 'isoWeek';
  }
  return startOf.call(this, period);
};
proto.endOf = function(period) {
  if (period === 'week') {
    period = 'isoWeek';
  }
  return endOf.call(this, period);
};

Maintenant, vous pouvez simplement utiliser someDate.startOf('week') sans vous soucier d'obtenir le dimanche ou de devoir réfléchir à l'utilisation de isoweek ou isoWeek, etc.

De plus, vous pouvez stocker ceci dans une variable comme const period = 'week' et l'utiliser en toute sécurité dans les opérations subtract() ou add(), par exemple moment().subtract(1, period).startOf(period);. Cela ne fonctionnera pas avec period étant isoWeek.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X