From c1feedb4dbc2e62fcbf3d7ad11c4b3aa7bdf2bb8 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Mon, 31 Mar 2025 23:24:11 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20fix=20week=20number=20bet?= =?UTF-8?q?ween=20years?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/public/app/widgets/buttons/calendar.ts | 58 +++++++++++++++------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/src/public/app/widgets/buttons/calendar.ts b/src/public/app/widgets/buttons/calendar.ts index 73a71c2bb..e1f9dc773 100644 --- a/src/public/app/widgets/buttons/calendar.ts +++ b/src/public/app/widgets/buttons/calendar.ts @@ -204,42 +204,62 @@ export default class CalendarWidget extends RightDropdownButtonWidget { } getWeekNumber(date: Date): number { - const utcDate = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())); + const year = dayjs(date).year(); + const jan1 = dayjs().year(year).month(0).date(1); + const jan1Day = jan1.day(); - const year = utcDate.getUTCFullYear(); - const jan1 = new Date(Date.UTC(year, 0, 1)); - const jan1Day = jan1.getUTCDay(); + let firstWeekStart = jan1.clone(); - let firstWeekStart = new Date(jan1); - - let dayOffset = (jan1Day - this.firstDayOfWeek + 7) % 7; - firstWeekStart.setUTCDate(firstWeekStart.getUTCDate() - dayOffset); + let dayOffset; + if (jan1Day < this.firstDayOfWeek) { + dayOffset = jan1Day + (7 - this.firstDayOfWeek); + } else { + dayOffset = jan1Day - this.firstDayOfWeek; + } + firstWeekStart = firstWeekStart.subtract(dayOffset, 'day'); switch (this.weekCalculationOptions.firstWeekType) { + // case 0 is default: week containing Jan 1 case 1: { - const thursday = new Date(firstWeekStart); - const day = thursday.getUTCDay(); + let thursday = firstWeekStart.clone(); + const day = thursday.day(); const offset = (4 - day + 7) % 7; - thursday.setUTCDate(thursday.getUTCDate() + offset); - if (thursday.getUTCFullYear() < year) { - firstWeekStart.setUTCDate(firstWeekStart.getUTCDate() + 7); + thursday = thursday.add(offset, 'day'); + if (thursday.year() < year) { + firstWeekStart = firstWeekStart.add(7, 'day'); } break; } case 2: { const daysInFirstWeek = 7 - dayOffset; if (daysInFirstWeek < this.weekCalculationOptions.minDaysInFirstWeek) { - firstWeekStart.setUTCDate(firstWeekStart.getUTCDate() + 7); + firstWeekStart = firstWeekStart.add(7, 'day'); } break; } - // case 0 is default: week containing Jan 1 } - const diffMillis = utcDate.getTime() - firstWeekStart.getTime(); - const diffDays = Math.floor(diffMillis / (24 * 60 * 60 * 1000)); + const diffDays = dayjs(date).diff(firstWeekStart, 'day') + 1; + const weekNumber = Math.floor(diffDays / 7) + 1; - return Math.floor(diffDays / 7) + 1; + // Check if the week number is less than 0, which means the date is in the previous year + if (weekNumber <= 0) { + const prevYearLastWeek = this.getWeekNumber(dayjs(date).subtract(1, 'year').endOf('year').toDate()); + return prevYearLastWeek; + } + + // Check if it's the last week of December + if (dayjs(date).month() === 11) { // December + const lastDayOfYear = dayjs().year(year).month(11).date(31); + const lastWeekStart = lastDayOfYear.subtract((lastDayOfYear.day() - this.firstDayOfWeek + 7) % 7, 'day'); + + if (this.isEqual(date, lastWeekStart.toDate())) { + const nextYearFirstWeek = this.getWeekNumber(lastDayOfYear.add(1, 'day').toDate()); + return nextYearFirstWeek; + } + } + + return weekNumber; } async dropdownShown() { @@ -294,7 +314,7 @@ export default class CalendarWidget extends RightDropdownButtonWidget { if (!b) return false; - return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); + return dayjs(a).isSame(dayjs(b), 'day'); } private getPrevMonthDays(firstDayOfWeek: number): { weekNumber: number, dates: Date[] } {