Moment: «weekOfYear» incorrect pour certains combos dow / doy

Créé le 21 déc. 2014  ·  13Commentaires  ·  Source: moment/moment

Il semble que l'algorithme de calcul de la semaine n'est pas assez générique, car il semble gérer certaines combinaisons dow / doy de manière incorrecte:

// see http://en.wikipedia.org/wiki/Seven-day_week#cite_ref-15
moment.locale(moment.locale(), { week: { dow: 6, doy: 1 } });
moment("2012-12-28", "YYYY-MM-DD").week(); // 51 -- should be 52?
moment("2012-12-29", "YYYY-MM-DD").week(); // 52 -- should be 1
moment("2013-01-01", "YYYY-MM-DD").week(); // 52 -- should be 1
moment("2013-01-08", "YYYY-MM-DD").week(); // 53 -- should be 2
moment("2013-01-11", "YYYY-MM-DD").week(); // 53 -- should be 2
moment("2013-01-12", "YYYY-MM-DD").week(); // 1 -- should be 3
moment().weeksInYear(2012); // 52

Je suppose que quelque chose ne va pas dans la fonction weekOfYear , sauf si je fais quelque chose de mal?

Bug

Commentaire le plus utile

Je ne peux pas expliquer le raisonnement du chemin, comment doy est défini, mais vous pouvez le définir sur 7 + dow - janXjanX est le x-ième janvier qui doit appartenir à la semaine N ° 1.

Donc, si le 1er janvier doit appartenir à la semaine n ° 1 et que le samedi est le premier jour de la semaine, alors doy = 7 + 6 - 1 = 12 . Pour l'ISO, ce serait doy = 7 + 1 - 4 = 4 pour les États-Unis, ce serait doy = 7 + 0 - 1 = 6 .

Tous les 13 commentaires

Des pensées? Cela affecte de nombreux paramètres régionaux où le premier jour de la semaine n'est ni dimanche ni lundi. Si le bogue est vérifié, dois-je soumettre une pull request pour un meilleur calcul weekOfYear , ou est-il déjà prévu de corriger l'algorithme actuel?

Je dois admettre que le paramètre doy me déroute assez. { dow: 6, doy: 12 } signifie que la semaine commence le samedi et que la semaine 1 est la semaine avec le 1er janvier. Si je comprends bien, {dow:6, doy: 1} signifierait que la 1ère semaine contient toujours le 26 décembre.

J'ai ajouté un test avec { dow: 6, doy: 12 } à la pull request.

Voulez-vous dire { dow: 6, doy: 1 } ? Je pense qu'une doy supérieure à 7 n'a aucune signification réelle. Était-ce une faute de frappe?

Non, je voulais dire {dow: 6, doy: 12} . Notez que doy n'est _pas_ le jour de janvier de la 1ère semaine. {dow: 6, doy: 12} est la norme dans les pays arabes - la semaine commence le samedi et la 1ère semaine est la semaine qui contient le 1er janvier.

Le bug n'était en fait pas dans le calcul de la semaine à partir de la date, juste dans l'autre sens.

Whoa, si c'est le cas, alors j'ai mal compris doy tout ce temps ..

En effet, selon la documentation localeData.firstDayOfYear() peut renvoyer n'importe quel entier compris entre 0 et 15 inclus, mais cela me semble tellement étrange.

Juste pour m'aider à comprendre, pouvez-vous expliquer pourquoi c'est 12 et non 1? Et que signifierait un doy de 1 ou 4 dans ce cas? Comment, exactement, les mathématiques fonctionnent-elles ici? Vous semblez avoir une bonne compréhension de cela.

J'ai trouvé une bonne explication , ce qui rend plus évident ce qu'est doy , même si je n'arrive toujours pas à comprendre comment il peut être supérieur à 6 ..

@icambron , pouvez-vous intervenir, s'il vous plaît? Existe-t-il un lien vers quelque part qui explique cela plus en détail que ne le font actuellement les documents?

@usmonster Ça fait longtemps que je n'ai pas regardé ça, mais du haut de ma tête ... oui, je ne comprends pas non plus. Désolé, je ne peux pas être plus utile. Chaque fois que j'écrivais l'explication liée, je venais d'écrire un tas d'implémentations de Moment pour les semaines de traitement, donc je l'ai probablement compris alors, mais cette explication ne semble pas concorder avec des valeurs de doy > 6, donc .. .

Je ne peux pas expliquer le raisonnement du chemin, comment doy est défini, mais vous pouvez le définir sur 7 + dow - janXjanX est le x-ième janvier qui doit appartenir à la semaine N ° 1.

Donc, si le 1er janvier doit appartenir à la semaine n ° 1 et que le samedi est le premier jour de la semaine, alors doy = 7 + 6 - 1 = 12 . Pour l'ISO, ce serait doy = 7 + 1 - 4 = 4 pour les États-Unis, ce serait doy = 7 + 0 - 1 = 6 .

Ah, si c'est _implémenté_ de cette façon, je pense que c'est un problème avec l'implémentation. Aucune autre définition que j'ai vue (c'est-à-dire ISO, Unicode TR35) ne définit le calcul de la semaine de l'année comme celui-ci. Les commentaires dans l'API n'indiquent même pas que c'est ce qui se passe, bien que maintenant je remarque que des tests ont été écrits qui supposent cette logique même, par exemple, je vois des lignes comme celle-ci:

dow : 1, // Monday is the first day of the week.
doy : 7  // The week that contains Jan 1st is the first week of the year.

Et dans un autre fichier:

dow : 6, // Saturday is the first day of the week.
doy : 12  // The week that contains Jan 1st is the first week of the year.

Votre évaluation de la mise en œuvre semble donc exacte. Pourtant, cela semble juste dégoûtant, comme si les tests étaient écrits pour correspondre à une implémentation cassée.

C'est particulièrement frustrant car une chose plus propre à faire aurait été de simplement réparer l'implémentation pour qu'elle fasse ce qui est intuitif (prenez le " janX " qui doit être dans la première semaine), mais le réparer maintenant ne serait pas t être rétrocompatible. Pouah.

Une alternative serait de déprécier doy et d'introduire une nouvelle option dans la configuration de la semaine, par exemple minDays ou dom , pour spécifier le nombre minimum de "jours de janvier" (1- 7) qui devrait être dans la première semaine de l'année. Cela remplacerait doy s'il était spécifié accidentellement.

Des pensées?

Pour autant que je sache, nous avons mis en place le code pendant des semaines ISO, puis nous avons abusé du fait et nous nous sommes assurés que les chiffres le permettaient.

Si nous changeons la sémantique pour qu'elle soit quelque chose de plus significatif pour les utilisateurs, ce sera peut-être mieux. Mais il devrait être rétrocompatible (donc les nouvelles méthodes exposent de nouveaux nombres).

Comme pour votre exemple, vous pouvez le faire fonctionner si vous ajoutez 7 plusieurs fois à doy, car c'est relatif à dow.

Clôture en faveur de # 2336

Bonjour @ichernev. :) Pour y revenir un an plus tard, je suis toujours en faveur de l'implémentation d'une sémantique plus significative, même si je suis presque certain qu'il n'est pas possible de faire quelque chose de rétrocompatible sans également changer la syntaxe.

vous pouvez le faire fonctionner si vous ajoutez 7 plusieurs fois à doy, car c'est relatif à dow.

Je ne suis pas convaincu que ce soit toujours le cas. Par exemple, { dow: 0, doy: 6 } ne signifierait pas la même chose avant et après le changement sémantique proposé. (C'est pourquoi j'avais proposé de déprécier doy en faveur d'un autre nom.)

Où dois-je rechercher plus de commentaires à ce sujet? Ce problème particulier est clos, mais je peux déplacer la conversation vers moment / momentjs.com # 279 ou ouvrir un nouveau problème si cela est plus approprié.

J'aimerais aussi revenir sur ce point, car j'ai passé une journée supplémentaire à essayer de comprendre comment fonctionne doy et j'ai dû télécharger la source du moment pour le faire. Ce serait formidable d'introduire une nouvelle variable de réglage plus pertinente sur le plan sémantique, comme le suggère @usmonster .

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