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.

313voto

tetri Points 376

Il vous suffit de remplacer begin.startOf('isoWeek'); par begin.startOf('week');.

25voto

Roberto Aguilar Points 31

De cette façon, vous pouvez définir le jour de la semaine initial.

moment.locale('fr', {
    week: {
        dow: 6
    }
});
moment.locale('fr');

Assurez-vous de l'utiliser avec moment().weekday(1); au lieu de moment.isoWeekday(1)

17voto

letiagoalves Points 5411

Appelez startOf avant isoWeekday.

var begin = moment(date).startOf('week').isoWeekday(1);

Démonstration fonctionnelle

2voto

davethecoder Points 1878

Je pensais ajouter ceci pour toutes les personnes futures. Cela garantira toujours que c'est lundi si nécessaire, et peut également être utilisé pour garantir toujours dimanche. Pour ma part, j'ai toujours besoin de lundi, mais la définition de local dépend de la machine utilisée, et c'est facilement corrigé :

var begin = moment().isoWeekday(1).startOf('week');
var begin2 = moment().startOf('week');
// pourrait vérifier si le jour 1 = dimanche puis ajouter 1 jour
// mon mac sur bst considère toujours le jour 1 comme dimanche

var firstDay = moment().startOf('week').format('dddd') === 'dimanche' ?
moment().startOf('week').add('d',1).format('dddd DD-MM-YYYY') :
moment().startOf('week').format('dddd DD-MM-YYYY');

document.body.innerHTML = 'pourrait être lundi ou dimanche selon le client :' +
begin.format('dddd DD-MM-YYYY') +
' devrait être lundi : ' + firstDay +
' pourrait aussi être dimanche ou lundi  ' +
begin2.format('dddd DD-MM-YYYY');

2voto

Hinrich Points 6226

Voici une solution plus générique pour n'importe quel jour de la semaine donné. Démo de travail sur jsfiddle

var myIsoWeekDay = 2; // disons que nos semaines commencent le mardi, pour le lundi vous taperiez 1, etc.

var startOfPeriod = moment("2013-06-23T00:00:00"),

// combien de jours devons-nous soustraire?
var daysToSubtract = moment(startOfPeriod).isoWeekday() >= myIsoWeekDay ?
    moment(startOfPeriod).isoWeekday() - myIsoWeekDay :
    7 + moment(startOfPeriod).isoWeekday() - myIsoWeekDay;

// soustraire les jours du début de la période
var begin = moment(startOfPeriod).subtract('d', daysToSubtract);

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