Commencer la semaine le lundi avec isoWeekday ()

117

Je crée un calendrier dans lequel j'imprime des semaines dans un format tabulaire. Une condition est que je puisse commencer les semaines le lundi ou le dimanche, selon certaines options de l'utilisateur. J'ai du mal à utiliser la méthode isoWeekday du moment .

// Start of some date range. Can be any day of the week.
var startOfPeriod = moment("2013-06-23T00:00:00"),

    // We begin on the start of the first week.
    // Mon Tues Wed Thur Fri Sat Sun
    // 20  21   22  23   24  25  26
    begin = moment(startOfPeriod).isoWeekday(1); // will pull from user setting

console.log(begin.isoWeekday()); // 1 - all good

// Let's get the beginning of this first week, respecting the isoWeekday
begin.startOf('week');

console.log(begin.isoWeekday()); // 7 - what happened ???

// Get column headers
for (var i=0; i<7; i++) {
    console.log(begin.format('ddd')); // I want Monday first!
    begin.add('d', 1);
}

jsFiddle

EDIT J'ai mal compris ce que isoWeekdayfaisait réellement. Je pensais qu'il définissait la variable "quel jour de la semaine est le premier jour de la semaine" (qui n'existe pas). En fait, il change simplement le jour de la semaine, tout comme moment.weekday(), mais utilise une plage de 1 à 7 au lieu de 0 à 6.

sauveur
la source

Réponses:

247

essayez d'utiliser begin.startOf('isoWeek');au lieu debegin.startOf('week');

tétri
la source
10
startOf('week')dépend de la localisation actuelle où dimanche marque évidemment le début de la semaine dans votre cas. startOf('iweek')obtiendra le début ISO de la semaine, qui est lundi. Mais vous avez raison, je n'ai trouvé aucune documentation sur le site officiel ...
devnull69
15
La version actuelle de moment.js utilise isoweek.
savinger
2
Modifié en fonction du commentaire de @ savinger et de la documentation actuelle :)
Matchu
20
isoWeek, avec un grand W, dans la dernière version
Michiel
8
Documenté ici: Start of Time
Vladimir Kornea
13

Appelez startOfavant isoWeekday.

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

Démo de travail

Letiagoalves
la source
1
Cela ne fonctionne pas correctement. Pour la date d'aujourd'hui, le 05/09/2016, il renvoie le 29/08/2016 comme date de début de la semaine, ce qui n'est pas vrai, car aujourd'hui est le lundi (semaine iso). la bonne réponse est déjà acceptée.
undefinedman
9

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

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

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

Roberto Aguilar
la source
2

j'ai pensé ajouter ceci pour tous les futurs potes. Il veillera toujours à ce que son lundi si nécessaire, puisse également être utilisé pour toujours assurer le dimanche. Pour moi, j'ai toujours besoin du lundi, mais le local dépend de la machine utilisée, et c'est une solution facile:

var begin = moment().isoWeekday(1).startOf('week');
var begin2 = moment().startOf('week');
// could check to see if day 1 = Sunday  then add 1 day
// my mac on bst still treats day 1 as sunday    

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

document.body.innerHTML = '<b>could be monday or sunday depending on client: </b><br />' + 
begin.format('dddd DD-MM-YYYY') + 
'<br /><br /> <b>should be monday:</b> <br>' + firstDay + 
'<br><br> <b>could also be sunday or monday </b><br> ' + 
begin2.format('dddd DD-MM-YYYY');
davethecoder
la source
1
moment de raccourci possible (). isoWeekday (1) .startOf ('isoweek'). format ('jjjj JJ MM AAAA')
davethecoder
2

Voici une solution plus générique pour un jour de semaine donné. Démo de travail sur jsfiddle

var myIsoWeekDay = 2; // say our weeks start on tuesday, for monday you would type 1, etc.

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

// how many days do we have to substract?
var daysToSubtract = moment(startOfPeriod).isoWeekday() >= myIsoWeekDay ?
    moment(startOfPeriod).isoWeekday() - myIsoWeekDay :
    7 + moment(startOfPeriod).isoWeekday() - myIsoWeekDay;

// subtract days from start of period
var begin = moment(startOfPeriod).subtract('d', daysToSubtract);
Hinrich
la source
-1

Pour ceux qui veulent isoWeekêtre la valeur par défaut, vous pouvez modifier le comportement du moment en tant que tel:

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 que vous obtiendrez le dimanche ou que vous deviez penser à utiliser isoweekou isoWeeketc.

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

Adam Reis
la source