Moment: O número da semana errado é retornado da função "week ()"

Criado em 19 jul. 2018  ·  5Comentários  ·  Fonte: moment/moment

Descrição do problema e etapas para reproduzir:
Ao criar uma data, por exemplo [2018, 11, 29] , e realizar a função week , o resultado é 52 , mas para [2018, 11, 30] e para 31 também retorna 1 . O resultado esperado é 52 .

Exemplo

const a = moment([2018, 11, 29]);
console.log('a', a.year(), a.week());
//a 2018 52

const b = moment([2018, 11, 30]);
console.log('b', b.year(), b.week());
//b 2018 1

jsbin exemplo ao vivo

Ambiente:
Safari 11.1.2 on OSX

Outras informações que podem ser úteis:

"Thu Jul 19 2018 16:52:11 GMT+0200 (CEST)"
"7/19/2018, 4:52:11 PM"
-120
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
"2.14.1"

Comentários muito úteis

Acho que você provavelmente tem uma expectativa de funcionamento da numeração da semana que difere da prática estabelecida.

por exemplo, você acha que 1º de janeiro está sempre na semana 1 e 31 de dezembro está sempre na semana 52/53 - e, para ser justo, alguns calendários de parede mostram uma numeração da semana assim.

Quando se trata de padronizar os números da semana, a preferência é garantir que uma semana sempre contenha 7 dias. Para o padrão ISO: as semanas vão de segunda a domingo, e a semana 1 contém a primeira quinta-feira do ano. O que significa que de segunda a quarta da semana 1 _pode_ cair no ano anterior. (isso acontecerá em 2019/2020: 29 a 31 de dezembro de 2019 são considerados parte da semana 1 de 2020)

Você não está usando os métodos ISO ( isoWeek() / isoWeekYear() ), então está contando com a definição de semana de sua localidade, que vai de domingo a sábado.

30 de dezembro de 2018 é um domingo e o primeiro dia da semana em sua localidade. Apenas 2 dias dessa semana caem em 2018, o resto é em 2019. As regras para sua localidade são usadas para decidir se aquela semana (todos os 7 dias) são classificados como 2018 semana 53 ou 2019 semana 1. No seu caso , eles disseram 2019 semana 1.

Todos 5 comentários

Encontramos o mesmo problema.
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
mostra 2018-w01

@ numen31337 Você provavelmente deseja usar weekYear () em vez de year()

@Blapi WW é a Semana ISO, então provavelmente você precisa usar GGGG vez de YYYY ao formatar ( GGGG é a ISO "Semana Ano" )

Vou esclarecer isso um pouco, aqui está o código com datas e saída relacionada:

const a = moment([2018, 11, 29]);
console.log(
            `a year: ${a.year()}`,  //a year: 2018
            `a month: ${a.month()}`, //a month: 11
            `a date: ${a.date()}`, //a date: 29
            `a week: ${a.week()}`, //a week: 52
            `a weekYear: ${a.weekYear()}`, //a weekYear: 2018
);

const b = moment([2018, 11, 30]);
console.log(
            `b year: ${b.year()}`, //b year: 2018
            `b month: ${b.month()}`, //b month: 11
            `b date: ${b.date()}`, //b date: 30
            `b week: ${b.week()}`, //b week: 1 <=== Why 1?
            `b weekYear: ${b.weekYear()}`, //b weekYear: 2019 <=== Why 2019?
);

O problema para mim é que week para 2018, 11, 30 retorna 1 vez de 52 . Talvez eu tenha entendido mal alguns conceitos desta biblioteca? A longo prazo, minha tarefa era calcular o número de semanas do calendário entre duas datas e fiz isso com a seguinte solução alternativa:

const fromDateStartWeek = fromDate.startOf('week');
const toDateStartWeek = toDate.startOf('week');
return toDateStartWeek.diff(fromDateStartWeek, 'weeks');

Mas eu ainda estou me perguntando sobre essa função week . Isso é um bug ou eu perdi algo? Eu venho do desenvolvimento nativo e bastante novo para o javascript. Obrigada.

Acho que você provavelmente tem uma expectativa de funcionamento da numeração da semana que difere da prática estabelecida.

por exemplo, você acha que 1º de janeiro está sempre na semana 1 e 31 de dezembro está sempre na semana 52/53 - e, para ser justo, alguns calendários de parede mostram uma numeração da semana assim.

Quando se trata de padronizar os números da semana, a preferência é garantir que uma semana sempre contenha 7 dias. Para o padrão ISO: as semanas vão de segunda a domingo, e a semana 1 contém a primeira quinta-feira do ano. O que significa que de segunda a quarta da semana 1 _pode_ cair no ano anterior. (isso acontecerá em 2019/2020: 29 a 31 de dezembro de 2019 são considerados parte da semana 1 de 2020)

Você não está usando os métodos ISO ( isoWeek() / isoWeekYear() ), então está contando com a definição de semana de sua localidade, que vai de domingo a sábado.

30 de dezembro de 2018 é um domingo e o primeiro dia da semana em sua localidade. Apenas 2 dias dessa semana caem em 2018, o resto é em 2019. As regras para sua localidade são usadas para decidir se aquela semana (todos os 7 dias) são classificados como 2018 semana 53 ou 2019 semana 1. No seu caso , eles disseram 2019 semana 1.

Obrigado pelo esclarecimento. Isso é realmente surpreendente para mim. Eu realmente sinto falta da API do Apple Calendar dateComponents (_: from: to :) onde você pode pedir uma diferença em componentes específicos, no meu caso Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay) e receber a diferença nas semanas reais do ano, não apenas days / 7 .

Esta página foi útil?
0 / 5 - 0 avaliações