Je crée un calendrier dans lequel j'imprime des semaines sous forme de tableau. Une des conditions est que je puisse commencer les semaines le lundi ou le dimanche, selon l'option choisie par l'utilisateur. J'ai de la difficulté à utiliser la méthode moment isoWeekday .
// 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);
}
EDIT J'ai mal compris ce que isoWeekday
était en train de faire. Je pensais définir la variable "quel jour de la semaine est le premier jour de la semaine" (cela n'existe pas). En réalité, il change simplement le jour de la semaine, comme pour moment.weekday()
, mais utilise une plage de 1-7 au lieu de 0-6.
essayez d'utiliser begin.startOf('isoWeek');
au lieu de begin.startOf('week');
Appelez startOf
avant isoWeekday
.
var begin = moment(date).startOf('week').isoWeekday(1);
pensais que je voudrais ajouter cela pour tous les futurs potes. Il s'assurera toujours que son lundi, si nécessaire, peut également être utilisé pour toujours assurer le dimanche. Pour moi, j'ai toujours besoin de lundi, mais 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');
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)
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);
Pour ceux qui veulent que isoWeek
soit 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 inquiéter, vous obtiendrez dimanche ou devrez vous demander s'il faut utiliser isoweek
ou isoWeek
etc.
De plus, vous pouvez la stocker dans une variable telle que 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 la période étant isoWeek
.