Skip to content

Commit 404f48b

Browse files
fix(calendar): keep recurrence times anchored to source timezone
- map recurring event instants with moment-timezone so viewer DST offsets stay correct - leave floating metadata available for full-day cases while returning structured payloads - update calendar fetcher unit spec to assert against the new occurrence wrapper
1 parent e423572 commit 404f48b

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

modules/default/calendar/calendar.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -589,12 +589,13 @@ Module.register("calendar", {
589589
* @returns {moment.Moment} moment with a timezone
590590
*/
591591
timestampToMoment (timestamp, isFullDayEvent = false, floatingDate = null) {
592-
const viewerOffsetMinutes = -new Date().getTimezoneOffset();
592+
const viewerTimezone = moment.tz.guess();
593593
if (isFullDayEvent && floatingDate) {
594-
return moment(floatingDate, "YYYY-MM-DD").utcOffset(viewerOffsetMinutes, true).startOf("day");
594+
return moment.tz(floatingDate, "YYYY-MM-DD", viewerTimezone).startOf("day");
595595
}
596-
const baseMoment = moment(timestamp, "x").utc();
597-
return baseMoment.clone().utcOffset(viewerOffsetMinutes, isFullDayEvent);
596+
const timestampMs = parseInt(timestamp, 10);
597+
const baseMoment = moment.utc(timestampMs);
598+
return baseMoment.clone().tz(viewerTimezone, isFullDayEvent);
598599
},
599600

600601
/**

tests/unit/modules/default/calendar/calendar_fetcher_utils_spec.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,13 @@ SUMMARY:Test
104104
TRANSP:OPAQUE
105105
END:VEVENT`);
106106

107-
const moments = CalendarFetcherUtils.getMomentsFromRecurringEvent(data["67e65a1d-b889-4451-8cab-5518cecb9c66"], moment(), moment().add(365, "days"));
107+
const occurrences = CalendarFetcherUtils.getMomentsFromRecurringEvent(data["67e65a1d-b889-4451-8cab-5518cecb9c66"], moment(), moment().add(365, "days"));
108108

109-
const januaryFirst = moments.filter((m) => m.format("MM-DD") === "01-01");
110-
const julyFirst = moments.filter((m) => m.format("MM-DD") === "07-01");
109+
const januaryFirst = occurrences.filter((entry) => entry.occurrence.format("MM-DD") === "01-01");
110+
const julyFirst = occurrences.filter((entry) => entry.occurrence.format("MM-DD") === "07-01");
111111

112-
expect(januaryFirst[0].toISOString(true)).toContain("09:00:00.000+01:00");
113-
expect(julyFirst[0].toISOString(true)).toContain("09:00:00.000+02:00");
112+
expect(januaryFirst[0].occurrence.toISOString(true)).toContain("09:00:00.000+01:00");
113+
expect(julyFirst[0].occurrence.toISOString(true)).toContain("09:00:00.000+02:00");
114114
});
115115
});
116116
});

0 commit comments

Comments
 (0)