web-dev-qa-db-fra.com

Moment.js - Commence la semaine le lundi avec isoWeekday ()

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);
}

jsFiddle

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.

94
savinger

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

190
tetri

Appelez startOf avant isoWeekday.

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

Démonstration de travail

9
letiagoalves

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');
2
davethecoder

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)

1
Roberto Aguilar

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);
1
Hinrich

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.

0
Adam Reis