Read the statement by Michael Teeuw here.
Issue with Outlook recurring events
-
Hello all.
I’m having some issues with Outlook calendar events in the default calendar app and I think I have narrowed it down to a daylight savings issue (bug?):

As you can see above, the recurring rule is expiring the evening before the event so these events do not show in my calendar.
I realise this is looking like a Microsoft issue but I wondered if anyone had encountered this before and knows how to fix it?
One thing that appears to work is setting my timezone to UTC then re-saving the event which I guess I can do unless someone has a better idea… Doing this sets the “UNTIL” time to 00:00 on the day of the actual event.
-
@WallysWellies this fix sets the rrule:until to start of day+1 day for fullday events (tested in LA, Chicago, London and Sydney timezones)
add three lines
modules/default/calendarcalendarfetcherutils.jsevent.start = rule.options.dtstart; // old code line 294 // insert these three lines if((rule.options.until != undefined) && CalendarFetcherUtils.isFullDayEvent(event)){ Log.debug("fixup rrule until") rule.options.until = new Date(new Date(moment(rule.options.until).startOf("day").add(1,"day")).getTime()) } Log.debug("fix rrule start=", rule.options.dtstart); // old code line 301 -
@WallysWellies if the event is a full day event(DTSTART:VALUE=DATE) then the rrule until should also only be date
also full day events are considered local timezone only
i dont think the parser (not our code) validates that
oh, then rrule processes it ( also not our code)
we call rrule.between() to get the list of events that match the rule between a year ago and an year forward(by default)
-
@WallysWellies do you have that full VEVENT so i can look at its processing in both places as i work on both
-
@sdetweil Here is a problematic event:
BEGIN:VEVENT DESCRIPTION:\n RRULE:FREQ=YEARLY;UNTIL=20250504T230000Z;INTERVAL=1;BYMONTHDAY=5;BYMONTH=5 UID:040000008200E00074C5B7101A82E00800000000DAEF6ED30D9FDA01000000000000000 010000000D37F812F0777844A93E97B96AD2D278B SUMMARY:Person A's Birthday DTSTART;VALUE=DATE:20250505 DTEND;VALUE=DATE:20250506 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20250428T133000Z TRANSP:TRANSPARENT STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:FREE X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:TRUE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT X-MICROSOFT-ISRESPONSEREQUESTED:FALSE END:VEVENTAnd here is a working event:
BEGIN:VEVENT DESCRIPTION:\n RRULE:FREQ=YEARLY;UNTIL=20250503T000000Z;INTERVAL=1;BYMONTHDAY=3;BYMONTH=5 UID:040000008200E00074C5B7101A82E00800000000591C9B3BAA0EDA01000000000000000 01000000005E6F2F9D20F7947B69F54FBF0794A6D SUMMARY:Person B's Birthday DTSTART;VALUE=DATE:20250503 DTEND;VALUE=DATE:20250504 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20250428T133000Z TRANSP:TRANSPARENT STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:FREE X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:TRUE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT X-MICROSOFT-ISRESPONSEREQUESTED:FALSE END:VEVENTThanks for taking a look.
-
@WallysWellies thanks, forgot to ask what timezone you are in
-
@sdetweil I’m in the UK. Since it’s British summer time I don’t know if that means I’m UTC+1 or something else… GMT, BST… Stupid changing clocks!
-
@WallysWellies this fix sets the rrule:until to start of day+1 day for fullday events (tested in LA, Chicago, London and Sydney timezones)
add three lines
modules/default/calendarcalendarfetcherutils.jsevent.start = rule.options.dtstart; // old code line 294 // insert these three lines if((rule.options.until != undefined) && CalendarFetcherUtils.isFullDayEvent(event)){ Log.debug("fixup rrule until") rule.options.until = new Date(new Date(moment(rule.options.until).startOf("day").add(1,"day")).getTime()) } Log.debug("fix rrule start=", rule.options.dtstart); // old code line 301 -
@sdetweil Thank you - that has fixed my upcoming calendar event 👍
-
@WallysWellies cool, i will submit as a change for next release
-
@WallysWellies you will need to use my upgrade script and reply no to keeping the changed files
see https://github.com/sdetweil/MagicMirror_scriptsnote upgrade is a two part process
test, do nothing (highlight exposed files, if any)
do upgrade -
S sdetweil has marked this topic as solved on
-
@WallysWellies I opened issue 3781
https://github.com/MagicMirrorOrg/MagicMirror/issues/3781
and pushed the fix and testcase for next release -
@sdetweil Thank you!
-
@WallysWellies this was accepted and added to the next release
-
Hi Sam,
I’m afraid this issue has reoccurred on an event that is not full day but instead is supposed to be the last in a series. I believe it’s the same issue though where the timezone / BST is causing the problem.
Sample ICS data below:
BEGIN:VCALENDAR METHOD:PUBLISH PRODID:Microsoft Exchange Server 2010 VERSION:2.0 X-WR-CALNAME:Test Calendar BEGIN:VTIMEZONE TZID:GMT Standard Time BEGIN:STANDARD DTSTART:16010101T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T010000 TZOFFSETFROM:+0000 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT RRULE:FREQ=WEEKLY;UNTIL=20250630T173000Z;INTERVAL=1;BYDAY=MO;WKST=MO UID:040000008200E00074C5B7101A82E00800000000E05582F27408DB01000000000000000 010000000E892CDFA6C0E4E4298E1C987B4791120 SUMMARY:Calendar Event DTSTART;TZID=GMT Standard Time:20250331T183000 DTEND;TZID=GMT Standard Time:20250331T200000 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20250630T164141Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:FALSE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT X-MICROSOFT-ISRESPONSEREQUESTED:FALSE END:VEVENT END:VCALENDARI’ve stripped out most of the content other than the event in question and the timezone info.
You’ll see that the DTSTART and DTEND data shows the correct start and end time but the RRULE shows the UNTIL as an hour before the event so the event does not show on the MM calendar module.
The event in Outlook shows the series being every Monday until 1st July.
I’m not sure if this “bug” is a problem with Outlook or MagicMirror.
Happy to start a new thread, or log a bug on GitHub if either of those is preferrable.
-
@WallysWellies there is a rewrite of the calendar event handler coming in tomorrow’s release .
please check there
-
I’m back with more calendar woes.
I’m apparently still having an issue where events in my Outlook calendar can under certain circumstances not appear on my MM. This is again a symptom of the event’s rrule ending prior to the last event in the series. Some ICS code below:
BEGIN:VCALENDAR METHOD:PUBLISH PRODID:Microsoft Exchange Server 2010 VERSION:2.0 X-WR-CALNAME:My Calendar BEGIN:VTIMEZONE TZID:GMT Standard Time BEGIN:STANDARD DTSTART:16010101T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T010000 TZOFFSETFROM:+0000 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT RRULE:FREQ=WEEKLY;UNTIL=20251007T164500Z;INTERVAL=1;BYDAY=TU;WKST=MO EXDATE;TZID=GMT Standard Time:20250930T174500 UID:040000008200E00074C5B7101A82E008000000004ECDB12BC10FDC01000000000000000 010000000012DADF723AF8140B35A2E374506E8D9 SUMMARY:My Event DTSTART;TZID=GMT Standard Time:20250826T174500 DTEND;TZID=GMT Standard Time:20250826T183000 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20251006T181942Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:FALSE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MICROSOFT-REQUESTEDATTENDANCEMODE:DEFAULT X-MICROSOFT-ISRESPONSEREQUESTED:FALSE END:VEVENT END:VCALENDARI’m not sure if this is something that can be resolved, or why it happens but I suspect some timezone issue as I’m based in the UK and we have to endure changing the clocks twice a year.
Having said that, the ICS file does not reflect the settings in the calendar for that event:

Anyone got any suggestions? Sorry to be a pest with this one!
-
@WallysWellies the event looks correct according to the start/end and rrule
ButWe do not use the custom timezone configuration in the iCal data
We use the worldwide standard IANA tz names
(Why one needs custom timezones is beyond me)Because so many users use MS products , I wrote a lookup table 5 years ago for the calendar parser we use, node-iCal
But
GMT Standard Time
Is not in that table (GMT has long been replaced by UTC)
UTC Standard Time
Is in the table
If the tz lookup fails, we use the local system timezone
-
The calendar automatically adjusts for STD/DST time changes
-
I don’t know why the rrule until says oct 08:164500, but oct 7 is the last Tuesday in the event cycle
Sept 30 was excluded
So all the iCal entry looks good except for the timezone
-
@sdetweil the timezone on my Pi is:
Local time: Mon 2025-10-06 20:26:51 BST Universal time: Mon 2025-10-06 19:26:51 UTC RTC time: Mon 2025-10-06 19:26:51 Time zone: Europe/London (BST, +0100) System clock synchronized: yes NTP service: active RTC in local TZ: noIs there something I need to do to try and resolve this? My MS calendar is set to a UTC timezone:

Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login