Moment: falsches `weekOfYear` für bestimmte Dow / Doy-Combos

Erstellt am 21. Dez. 2014  ·  13Kommentare  ·  Quelle: moment/moment

Es scheint, dass der Wochenberechnungsalgorithmus nicht generisch genug ist, da er bestimmte Dow / Doy-Kombinationen falsch behandelt:

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

Ich gehe davon aus, dass in der Funktion weekOfYear etwas nicht stimmt, es sei denn, ich mache etwas falsch?

Bug

Hilfreichster Kommentar

Ich kann die Gründe für die Definition von doy nicht erklären, aber Sie können sie auf 7 + dow - janX wobei janX der x-te Januar ist, der zur Woche gehören muss Nr. 1.

Wenn also der 1. Januar zur Woche Nr. 1 gehören muss und der Samstag der erste Tag der Woche ist, dann doy = 7 + 6 - 1 = 12 . Für ISO wäre es doy = 7 + 1 - 4 = 4 für US wäre es doy = 7 + 0 - 1 = 6 .

Alle 13 Kommentare

Irgendwelche Gedanken? Dies betrifft viele Regionen, in denen der erste Tag der Woche nicht Sonntag oder Montag ist. Wenn der Fehler überprüft wird, sollte ich eine Pull-Anfrage für eine bessere Berechnung von weekOfYear senden, oder gibt es bereits Pläne, den aktuellen Algorithmus zu korrigieren?

Ich muss zugeben, dass mich die Einstellung doy ziemlich verwirrt. { dow: 6, doy: 12 } bedeutet, dass die Woche am Samstag beginnt und dass die Woche 1 die Woche mit dem 1. Januar ist. Wenn ich es richtig verstehe, würde {dow:6, doy: 1} bedeuten, dass die erste Woche immer den 26. Dezember enthält.

Ich habe der Pull-Anfrage einen Test mit { dow: 6, doy: 12 } hinzugefügt.

Meinst du { dow: 6, doy: 1 } ? Ich denke, ein doy größer als 7 hat keine wirkliche Bedeutung. War das ein Tippfehler?

Nein, ich habe {dow: 6, doy: 12} gemeint. Beachten Sie, dass doy nicht der Tag im Januar ist, der in der 1. Woche liegt. {dow: 6, doy: 12} ist der Standard in arabischen Ländern - die Woche beginnt am Samstag und die 1. Woche ist die Woche, die den 1. Januar enthält.

Der Fehler war eigentlich nicht in der Berechnung der Woche ab dem Datum, nur in die andere Richtung.

Whoa, wenn das der Fall ist, dann habe ich die ganze Zeit doy falsch verstanden.

In der Tat kann localeData.firstDayOfYear() laut den Dokumenten jede ganze Zahl zwischen 0 und einschließlich 15 zurückgeben, aber das scheint mir so seltsam.

Können Sie mir zum besseren Verständnis erklären, warum es 12 und nicht 1 ist? Und was würde ein doy von 1 oder 4 in diesem Fall bedeuten? Wie genau funktioniert die Mathematik hier? Sie scheinen ein gutes Verständnis dafür zu haben.

Ich habe eine gute Erklärung gefunden , die es offensichtlicher macht, was doy ist, obwohl ich immer noch nicht herausfinden kann, wie es jemals größer als 6 sein kann.

@icambron , kannst du bitte

@usmonster Es ist lange her, dass ich mir das angeschaut habe, aber auf den ersten Blick ... ja, ich verstehe es auch nicht. Entschuldigung, ich kann nicht hilfreicher sein. Wann immer ich die verknüpfte Erklärung schrieb, hatte ich gerade eine Reihe von Moment-Implementierungen für die Handhabung von Wochen geschrieben, also habe ich sie wahrscheinlich damals verstanden, aber diese Erklärung scheint nicht mit doy -Werten> 6 zu leben, also .. .

Ich kann die Gründe für die Definition von doy nicht erklären, aber Sie können sie auf 7 + dow - janX wobei janX der x-te Januar ist, der zur Woche gehören muss Nr. 1.

Wenn also der 1. Januar zur Woche Nr. 1 gehören muss und der Samstag der erste Tag der Woche ist, dann doy = 7 + 6 - 1 = 12 . Für ISO wäre es doy = 7 + 1 - 4 = 4 für US wäre es doy = 7 + 0 - 1 = 6 .

Ah, wenn es auf diese Weise implementiert wird, denke ich, dass es ein Problem mit der Implementierung ist. Keine andere Definition, die ich gesehen habe (dh ISO, Unicode TR35), definiert die Berechnung der Woche pro Jahr so. Die Kommentare in der API deuten nicht einmal darauf hin, dass dies der Fall ist, obwohl ich jetzt bemerke, dass Tests geschrieben wurden, die genau diese Logik annehmen, z. B. sehe ich Zeilen wie diese:

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.

Und in einer anderen Datei:

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.

Ihre Einschätzung der Implementierung sieht also korrekt aus. Trotzdem fühlt es sich nur eklig an, als ob die Tests so geschrieben wurden, dass sie zu einer kaputten Implementierung passen.

Dies ist besonders frustrierend, da es sauberer gewesen wäre, die Implementierung so zu reparieren, dass sie das tut, was intuitiv ist (nehmen Sie das " janX ", das in der ersten Woche sein muss), aber es jetzt nicht zu reparieren. t abwärtskompatibel sein. Pfui.

Eine Alternative wäre, doy zu verwerfen und eine neue Option in die Wochenkonfiguration einzuführen, z. B. minDays oder dom , um die Mindestanzahl von "Januartagen" anzugeben (1- 7) das sollte in der ersten Woche des Jahres sein. Dies würde doy überschreiben, wenn es versehentlich angegeben wurde.

Irgendwelche Gedanken?

Soweit ich das beurteilen kann, hatten wir den Code für ISO-Wochen eingerichtet, dann haben wir die Tatsache irgendwie missbraucht und sichergestellt, dass die Zahlen funktionieren.

Wenn wir die Semantik so ändern, dass sie für Benutzer etwas aussagekräftiger ist, ist sie möglicherweise besser. Es sollte jedoch abwärtskompatibel sein (so dass neue Methoden neue Zahlen verfügbar machen).

In Ihrem Beispiel können Sie dafür sorgen, dass es funktioniert, wenn Sie ein paar Mal 7 zu Doy hinzufügen, da es relativ zu Dow ist.

Schließen Sie dies zugunsten von # 2336

Hallo @ichernev. :) Ein Jahr später bin ich immer noch dafür, eine aussagekräftigere Semantik zu implementieren, obwohl ich fast sicher bin, dass es nicht möglich ist, etwas abwärtskompatibles zu tun, ohne auch die Syntax zu ändern.

Sie können es zum Laufen bringen, wenn Sie ein paar Mal 7 zu Doy hinzufügen, da es relativ zu Dow ist.

Ich bin nicht davon überzeugt, dass dies immer der Fall ist. Zum Beispiel würde { dow: 0, doy: 6 } vor und nach der vorgeschlagenen semantischen Änderung nicht dasselbe bedeuten. (Aus diesem Grund hatte ich vorgeschlagen, doy zugunsten eines anderen Namens zu verwerfen.)

Wo soll ich nach mehr Feedback dazu suchen? Dieses spezielle Problem ist geschlossen, obwohl ich die Konversation auf moment / momentjs.com # 279 verschieben oder ein neues Problem eröffnen kann, wenn es angemessener ist.

Ich würde dies auch gerne anstoßen, da ich einen zusätzlichen Tag damit verbracht habe, herauszufinden, wie doy funktioniert, und die Momentquelle herunterladen musste, um dies zu tun. Es wäre großartig, eine neue, semantisch relevantere Einstellungsvariable einzuführen , wie

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen