Moment: Von der Funktion "week()" wird eine falsche Wochennummer zurückgegeben

Erstellt am 19. Juli 2018  ·  5Kommentare  ·  Quelle: moment/moment

Beschreibung des Problems und Schritte zur Reproduktion:
Wenn Sie ein Datum erstellen, zum Beispiel [2018, 11, 29] , und die Funktion week ausführen, ist das Ergebnis 52 , aber für [2018, 11, 30] und für 31 außerdem gibt es 1 . Das erwartete Ergebnis ist 52 .

Beispiel

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 Live-Beispiel

Umfeld:
Safari 11.1.2 on OSX

Weitere Informationen, die hilfreich sein können:

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

Hilfreichster Kommentar

Ich denke, Sie haben wahrscheinlich eine andere Erwartung an die Funktionsweise der Wochennummerierung als die etablierte Praxis.

zB denken Sie, der 1. Januar ist immer in Woche 1 und der 31. Dezember ist immer in Woche 52/53 - und um fair zu sein, einige Wandkalender zeigen eine solche Wochennummerierung an.

Bei der Vereinheitlichung der Wochennummern wird bevorzugt darauf geachtet, dass eine Woche immer 7 Tage umfasst. Für den ISO-Standard: Wochen läuft von Montag bis Sonntag, und Woche 1 enthält den ersten Donnerstag des Jahres. Das bedeutet, dass Montag-Mittwoch der Woche 1 _mai_ in das Vorjahr fällt. (Dies wird 2019/2020 passieren: 29.-31. Dezember 2019 gelten als Teil der Woche 1 von 2020)

Sie verwenden nicht die ISO-Methoden ( isoWeek() / isoWeekYear() ), also verlassen Sie sich auf die Definition einer Woche in Ihrem Gebietsschema, die von Sonntag bis Samstag läuft.

Der 30. Dezember 2018 ist ein Sonntag und der erste Tag einer Woche in Ihrem Gebiet. Nur 2 Tage dieser Woche fallen in 2018, der Rest ist in 2019. Die Regeln für Ihr Gebietsschema werden verwendet, um zu entscheiden, ob diese Woche (alle 7 Tage) als 2018 Woche 53 oder 2019 Woche 1 eingestuft wird. In Ihrem Fall , sie haben 2019 Woche 1 gesagt.

Alle 5 Kommentare

Wir stoßen auf das gleiche Problem.
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
zeigt 2018-w01

@numen31337 Sie möchten wahrscheinlich weekYear() anstelle von year()

@Blapi WW ist die ISO-Woche, daher müssen Sie beim Formatieren wahrscheinlich GGGG anstelle von YYYY ( GGGG ist das ISO "Wochenjahr" )

Ich werde dies ein wenig klarstellen, hier ist Code mit Datumsangaben und zugehöriger Ausgabe:

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

Das Problem für mich ist, dass week für 2018, 11, 30 1 anstelle von 52 zurückgibt. Vielleicht habe ich einige Konzepte dieser Bibliothek falsch verstanden? Langfristig bestand meine Aufgabe darin, die Anzahl der Kalenderwochen zwischen zwei Terminen zu berechnen und das habe ich mit folgendem Workaround geschafft:

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

Aber ich wundere mich immer noch über diese week Funktion. Ist das ein Bug oder übersehe ich etwas? Ich komme aus der nativen Entwicklung und bin ziemlich neu im Javascript. Dankeschön.

Ich denke, Sie haben wahrscheinlich eine andere Erwartung an die Funktionsweise der Wochennummerierung als die etablierte Praxis.

zB denken Sie, der 1. Januar ist immer in Woche 1 und der 31. Dezember ist immer in Woche 52/53 - und um fair zu sein, einige Wandkalender zeigen eine solche Wochennummerierung an.

Bei der Vereinheitlichung der Wochennummern wird bevorzugt darauf geachtet, dass eine Woche immer 7 Tage umfasst. Für den ISO-Standard: Wochen läuft von Montag bis Sonntag, und Woche 1 enthält den ersten Donnerstag des Jahres. Das bedeutet, dass Montag-Mittwoch der Woche 1 _mai_ in das Vorjahr fällt. (Dies wird 2019/2020 passieren: 29.-31. Dezember 2019 gelten als Teil der Woche 1 von 2020)

Sie verwenden nicht die ISO-Methoden ( isoWeek() / isoWeekYear() ), also verlassen Sie sich auf die Definition einer Woche in Ihrem Gebietsschema, die von Sonntag bis Samstag läuft.

Der 30. Dezember 2018 ist ein Sonntag und der erste Tag einer Woche in Ihrem Gebiet. Nur 2 Tage dieser Woche fallen in 2018, der Rest ist in 2019. Die Regeln für Ihr Gebietsschema werden verwendet, um zu entscheiden, ob diese Woche (alle 7 Tage) als 2018 Woche 53 oder 2019 Woche 1 eingestuft wird. In Ihrem Fall , sie haben 2019 Woche 1 gesagt.

Danke für die Abklärung. Das ist wirklich überraschend für mich. Ich vermisse wirklich die API wie von Apple Calendar dateComponents(_:from:to:), wo Sie nach einem Diff in bestimmten Komponenten fragen können, in meinem Fall Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay) und das Diff in den echten Wochen des Jahres erhalten. nicht nur days / 7 .

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen