Moment: Un numéro de semaine incorrect est renvoyé par la fonction "week()"

Créé le 19 juil. 2018  ·  5Commentaires  ·  Source: moment/moment

Description du problème et étapes à suivre :
Lors de la création d'une date, par exemple [2018, 11, 29] , et de l'exécution de la fonction week , le résultat est 52 , mais pour [2018, 11, 30] et pour 31 il renvoie également 1 . Le résultat attendu est 52 .

Exemple

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

exemple en direct jsbin

Environnement:
Safari 11.1.2 on OSX

Autres informations pouvant être utiles :

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

Commentaire le plus utile

Je pense que vous vous attendez probablement à ce que le fonctionnement de la numérotation des semaines diffère de la pratique établie.

Par exemple, vous pensez que le 1er janvier est toujours dans la semaine 1, et le 31 décembre est toujours dans la semaine 52/53 - et, pour être honnête, certains calendriers muraux affichent une numérotation des semaines comme celle-ci.

Lorsqu'il s'agit de standardiser les numéros de semaine, la préférence est de s'assurer qu'une semaine contient toujours 7 jours. Pour la norme ISO : les semaines s'étendent du lundi au dimanche et la semaine 1 contient le premier jeudi de l'année. Ce qui signifie que le lundi-mercredi de la semaine 1 _peut_ tomber l'année précédente. (cela se produira en 2019/2020 : les 29 et 31 décembre 2019 sont considérés comme faisant partie de la semaine 1 de 2020)

Vous n'utilisez pas les méthodes ISO ( isoWeek() / isoWeekYear() ), vous vous fiez donc à la définition d'une semaine de votre locale, qui s'étend du dimanche au samedi.

Le 30 décembre 2018 est un dimanche et le premier jour d'une semaine dans votre région. Seuls 2 jours de cette semaine tombent en 2018, le reste est en 2019. Les règles de votre région sont utilisées pour décider si cette semaine (tous les 7 jours) est classée comme 2018 semaine 53 ou 2019 semaine 1. Dans votre cas , ils ont dit 2019 semaine 1.

Tous les 5 commentaires

Nous rencontrons le même problème.
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
montre 2018-w01

@numen31337 Vous voulez probablement utiliser weekYear() au lieu de year()

@Blapi WW est la semaine ISO, vous devrez donc probablement utiliser GGGG au lieu de YYYY lors du formatage ( GGGG est l'ISO "Semaine Année" )

Je vais clarifier cela un peu, voici le code avec les dates et la sortie associée :

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

Le problème pour moi est que week pour 2018, 11, 30 renvoie 1 au lieu de 52 . Peut-être que j'ai mal compris certains concepts de cette bibliothèque ? À long terme, ma tâche consistait à calculer le nombre de semaines calendaires entre deux dates et je l'ai fait avec la solution de contournement suivante :

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

Mais je me pose encore des questions sur cette fonction week . Est-ce un bug ou j'ai raté quelque chose ? Je viens du développement natif et assez nouveau sur le javascript. Merci.

Je pense que vous vous attendez probablement à ce que le fonctionnement de la numérotation des semaines diffère de la pratique établie.

Par exemple, vous pensez que le 1er janvier est toujours dans la semaine 1, et le 31 décembre est toujours dans la semaine 52/53 - et, pour être honnête, certains calendriers muraux affichent une numérotation des semaines comme celle-ci.

Lorsqu'il s'agit de standardiser les numéros de semaine, la préférence est de s'assurer qu'une semaine contient toujours 7 jours. Pour la norme ISO : les semaines s'étendent du lundi au dimanche et la semaine 1 contient le premier jeudi de l'année. Ce qui signifie que le lundi-mercredi de la semaine 1 _peut_ tomber l'année précédente. (cela se produira en 2019/2020 : les 29 et 31 décembre 2019 sont considérés comme faisant partie de la semaine 1 de 2020)

Vous n'utilisez pas les méthodes ISO ( isoWeek() / isoWeekYear() ), vous vous fiez donc à la définition d'une semaine de votre locale, qui s'étend du dimanche au samedi.

Le 30 décembre 2018 est un dimanche et le premier jour d'une semaine dans votre région. Seuls 2 jours de cette semaine tombent en 2018, le reste est en 2019. Les règles de votre région sont utilisées pour décider si cette semaine (tous les 7 jours) est classée comme 2018 semaine 53 ou 2019 semaine 1. Dans votre cas , ils ont dit 2019 semaine 1.

Merci pour la clarification. C'est vraiment surprenant pour moi. L'API me manque vraiment comme celle d'Apple Calendar dateComponents(_:from:to:) où vous pouvez demander un diff dans des composants spécifiques, dans mon cas Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay) et recevoir le diff dans les vraies semaines de l'année, pas seulement days / 7 .

Cette page vous a été utile?
0 / 5 - 0 notes