Começando a semana na segunda-feira com isoWeekday ()

116

Estou criando um calendário onde imprimo semanas em formato tabular. Um dos requisitos é que eu possa começar as semanas na segunda ou no domingo, conforme alguma opção do usuário. Estou tendo dificuldade em usar o método isoWeekday do momento .

// 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

EDITAR Eu entendi mal o que isoWeekdayestava realmente fazendo. Pensei que definisse a variável "qual dia da semana é o primeiro dia da semana" (que não existe). O que ele realmente faz é simplesmente alterar o dia da semana, assim como moment.weekday(), mas usa um intervalo de 1-7 em vez de 0-6.

salvador
fonte

Respostas:

246

tente usar em begin.startOf('isoWeek');vez debegin.startOf('week');

tetri
fonte
10
startOf('week')depende do local atual onde o domingo obviamente marca o início da semana no seu caso. startOf('iweek')obterá o ISO de início da semana, que é segunda-feira. Mas você está certo, eu não encontrei nenhuma documentação no site oficial ...
devnull69
15
A versão atual do moment.js está usando isoweek.
salvador de
2
Editado de acordo com o comentário de @savinger e os documentos atuais :)
Matchu
20
isoWeek, com um W maiúsculo, na versão mais recente
Michiel
8
Documentado aqui: Início do Tempo
Vladimir Kornea
13

Ligue startOfantes isoWeekday.

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

Demonstração de trabalho

letiagoalves
fonte
1
Isso não funciona corretamente. Para a data de hoje, 05-09-2016, ele retorna 29-08-2016 como uma data de início da semana, o que não é verdade, porque hoje é segunda-feira (semana iso). a resposta adequada já foi aceita.
undefinedman
9

Desta forma, você pode definir o primeiro dia da semana.

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

Certifique-se de usá-lo com em moment().weekday(1);vez de moment.isoWeekday (1)

Roberto Aguilar
fonte
2

pensei que eu adicionaria isso para qualquer pessoa no futuro. Garantirá sempre que é segunda-feira se necessário, também pode ser usado para garantir sempre domingo. Para mim, sempre preciso de segunda-feira, mas o local depende da máquina que está sendo usada e esta é uma solução fácil:

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
fonte
1
possível momento de atalho (). isoWeekday (1) .startOf ('isoweek'). format ('dddd DD MM AAAA')
davethecoder
2

Aqui está uma solução mais genérica para qualquer dia da semana. Demonstração de trabalho no 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
fonte
-1

Para aqueles que querem isoWeekser o padrão, você pode modificar o comportamento do momento da seguinte forma:

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

Agora você pode simplesmente usar someDate.startOf('week')sem se preocupar se chegará domingo ou ter que pensar se usará isoweekou isoWeeketc.

Além disso, você pode armazenar isso em uma variável como const period = 'week'e usá-lo com segurança em operações subtract()ou add(), por exemplo moment().subtract(1, period).startOf(period);. Isso não funcionará com período isoWeek.

Adam Reis
fonte