diff --git a/src/utils/events.js b/src/utils/events.js index bc79b4b..a56fc4f 100644 --- a/src/utils/events.js +++ b/src/utils/events.js @@ -91,25 +91,27 @@ function getDateWeekly(event, n, timeZone = DEFAULT_TZ) { let occ = n if (!baseCountsAsPattern) occ -= 1 if (occ < 0) return null - const patternDays = [] - for (let d = 0; d < 7; d++) if (pattern[d]) patternDays.push(d) - const firstWeekDates = [] - for (const d of patternDays) { - if (d < baseDow) continue - const date = dateFns.addDays(baseWeekMonday, d) - if (date < baseStart) continue - firstWeekDates.push(date) + // Build Monday-based offsets (0=Mon..6=Sun) for all active pattern days + const offsets = pattern + .reduce((acc, active, i) => (active ? [...acc, (i + 6) % 7] : acc), []) + .sort((a, b) => a - b) + const dates = [] + const baseOffset = (baseDow + 6) % 7 + for (const off of offsets) { + if (off < baseOffset) continue + const d = dateFns.addDays(baseWeekMonday, off) + if (d < baseStart) continue + dates.push(d) } - const F = firstWeekDates.length - if (occ < F) return toLocalString(firstWeekDates[occ], timeZone) + const F = dates.length + if (occ < F) return toLocalString(dates[occ], timeZone) const remaining = occ - F - const P = patternDays.length + const P = offsets.length if (P === 0) return null const k = Math.floor(remaining / P) + 1 const indexInWeek = remaining % P - const dow = patternDays[indexInWeek] - const occurrenceDate = dateFns.addDays(baseWeekMonday, k * interval * 7 + dow) - return toLocalString(occurrenceDate, timeZone) + const date = dateFns.addDays(baseWeekMonday, k * interval * 7 + offsets[indexInWeek]) + return toLocalString(date, timeZone) } function getDateMonthly(event, n, timeZone = DEFAULT_TZ) {