Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Recurring events do not respect current DST if created before changing to or from current DST #3098

Closed
Ryanclbryant opened this issue May 4, 2023 · 7 comments

Comments

@Ryanclbryant
Copy link

I have several recurring meetings which are being displayed with an incorrect start/end time using the default calendar module. I'm using vdirsyncer to pull my calendar down from Google Calendar into a local file on my rpi 4 running:
Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux

One sample of a problematic event:

BEGIN:VEVENT
DTSTART;TZID=America/Edmonton:20230504T140000
DTEND;TZID=America/Edmonton:20230504T150000
DTSTAMP:20230502T002709Z
UID:*******@google.com
X-GOOGLE-CONFERENCE:***********
RECURRENCE-ID;TZID=America/Toronto:20230504T160000
CLASS:PRIVATE
CREATED:20230309T052934Z
DESCRIPTION:**************
LAST-MODIFIED:20230502T002709Z
LOCATION:
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:**************
TRANSP:OPAQUE
END:VEVENT

This has the correct start and end time of my event in my local timezone; 2023-05-04 14:00 - 2023-05-04 15:00. The calendar module is displaying the start/end of this event as 2023-05-04 13:00 - 2023-05-04 14:00 incorrectly.

When checking the debug for Magic mirror, appears to be adjusting the start time back 1 hour due to daylight savings, even though the start/end time has already accommodated for this.

[04.05.2023 09:40.52.755] [DEBUG] Processing entry...
[04.05.2023 09:40.52.757] [DEBUG] Event:
{"type":"VEVENT","params":[],"start":"2023-01-12T21:00:00.000Z","datetype":"date-time","end":"2023-01-12T22:00:00.000Z","rrule":{"_cache":{"all":false,"before":[],"after":[],"between":[]},"origOptions":{"tzid":"America/Toronto","dtstart":"2023-01-12T21:00:00.000Z","freq":2,"wkst":{"weekday":6},"interval":2,"byweekday":[{"weekday":3}]},"options":{"freq":2,"dtstart":"2023-01-12T21:00:00.000Z","interval":2,"wkst":6,"count":null,"until":null,"tzid":"America/Toronto","bysetpos":null,"bymonth":null,"bymonthday":[],"bynmonthday":[],"byyearday":null,"byweekno":null,"byweekday":[3],"bynweekday":null,"byhour":[21],"byminute":[0],"bysecond":[0],"byeaster":null}},"dtstamp":"2023-05-02T00:26:59.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*******","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"********","lastmodified":"2023-05-02T00:26:59.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"**********","transparency":"OPAQUE","recurrences":{"2023-01-26":{"type":"VEVENT","params":[],"start":"2023-01-26T21:00:00.000Z","datetype":"date-time","end":"2023-01-26T22:00:00.000Z","dtstamp":"2023-05-02T00:26:59.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-01-26T21:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:26:59.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-02-23":{"type":"VEVENT","params":[],"start":"2023-02-23T21:00:00.000Z","datetype":"date-time","end":"2023-02-23T22:00:00.000Z","dtstamp":"2023-05-02T00:26:59.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-02-23T21:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:26:59.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-03-09":{"type":"VEVENT","params":[],"start":"2023-03-09T21:00:00.000Z","datetype":"date-time","end":"2023-03-09T22:00:00.000Z","dtstamp":"2023-05-02T00:26:59.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-03-09T21:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:26:59.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-04-06":{"type":"VEVENT","params":[],"start":"2023-04-06T20:00:00.000Z","datetype":"date-time","end":"2023-04-06T21:00:00.000Z","dtstamp":"2023-05-02T00:26:59.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-04-06T20:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:26:59.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-04-20":{"type":"VEVENT","params":[],"start":"2023-04-20T20:00:00.000Z","datetype":"date-time","end":"2023-04-20T21:00:00.000Z","dtstamp":"2023-05-02T00:26:59.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-04-20T20:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:26:59.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-05-04":{"type":"VEVENT","params":[],"start":"2023-05-04T20:00:00.000Z","datetype":"date-time","end":"2023-05-04T21:00:00.000Z","dtstamp":"2023-05-02T00:27:09.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-05-04T20:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:27:09.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-06-29":{"type":"VEVENT","params":[],"start":"2023-06-29T20:00:00.000Z","datetype":"date-time","end":"2023-06-29T21:00:00.000Z","dtstamp":"2023-05-02T00:27:09.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-06-29T20:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:27:09.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-07-27":{"type":"VEVENT","params":[],"start":"2023-07-27T20:00:00.000Z","datetype":"date-time","end":"2023-07-27T21:00:00.000Z","dtstamp":"2023-05-02T00:27:09.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-07-27T20:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:27:09.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"},"2023-12-28":{"type":"VEVENT","params":[],"start":"2023-12-28T21:00:00.000Z","datetype":"date-time","end":"2023-12-28T22:00:00.000Z","dtstamp":"2023-05-02T00:27:09.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-12-28T21:00:00.000Z","class":"PRIVATE","created":"2023-03-09T05:29:34.000Z","description":"*********","lastmodified":"2023-05-02T00:27:09.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"}}}
[04.05.2023 09:40.52.759] [DEBUG] title: *******************
[04.05.2023 09:40.52.760] [DEBUG] Search for recurring events between: Sun Mar 05 2023 00:00:00 GMT-0700 (Mountain Standard Time) and Sun Jul 02 2023 23:59:59 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.768] [DEBUG] Title: *******************, with dates: ["2023-03-09T19:00:00.000Z","2023-03-23T19:00:00.000Z","2023-04-06T19:00:00.000Z","2023-04-20T19:00:00.000Z","2023-05-04T19:00:00.000Z","2023-05-18T19:00:00.000Z","2023-06-01T19:00:00.000Z","2023-06-15T19:00:00.000Z","2023-06-29T19:00:00.000Z"]
[04.05.2023 09:40.52.768] [DEBUG] event.recurrences: [object Object]
...
[04.05.2023 09:58.37.889] [DEBUG]  recurring date is Thu May 04 2023 13:00:00 GMT-0600 (Mountain Daylight Time) offset is 360
[04.05.2023 09:58.37.890] [DEBUG]  recurring date is Thu May 04 2023 13:00:00 GMT-0600 (Mountain Daylight Time) offset is 6 Hour is 13
[04.05.2023 09:58.37.890] [DEBUG] Corrected startDate: Thu May 04 2023 13:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:58.37.890] [DEBUG] initial tz=America/Toronto
[04.05.2023 09:58.37.891] [DEBUG] corrected tz=America/Toronto
[04.05.2023 09:58.37.891] [DEBUG] start date/time=Thu Jan 12 2023 14:00:00 GMT-0700 (Mountain Standard Time)
[04.05.2023 09:58.37.892] [DEBUG] start offset=-300
[04.05.2023 09:58.37.893] [DEBUG] start date/time w tz =Thu Jan 12 2023 14:00:00 GMT-0700 (Mountain Standard Time)
[04.05.2023 09:58.37.895] [DEBUG] event date=Thu May 04 2023 13:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:58.37.896] [DEBUG] event offset=-240 hour=15 event date=Thu May 04 2023 13:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:58.37.897] [DEBUG] offset
[04.05.2023 09:58.37.897] [DEBUG] adjust down 1 hour dst change
[04.05.2023 09:58.37.899] [DEBUG] adjustHours=-1
[04.05.2023 09:58.37.913] [DEBUG] duration: 3600000
[04.05.2023 09:58.37.914] [DEBUG] saving event: *****************

The correct event date should have been: Thu May 04 2023 14:00:00 GMT-0600 (Mountain Daylight Time). The GMT timestamp is recorded as 19:00, when the correct time is actually 20:00, so I believe the issue is in identifying the accurate start time in GMT for the recurrences within this scenario.

This line:

with dates: ["2023-03-09T19:00:00.000Z","2023-03-23T19:00:00.000Z","2023-04-06T19:00:00.000Z","2023-04-20T19:00:00.000Z","2023-05-04T19:00:00.000Z","2023-05-18T19:00:00.000Z","2023-06-01T19:00:00.000Z","2023-06-15T19:00:00.000Z","2023-06-29T19:00:00.000Z"]

Should actually be:

with dates: ["2023-03-09T20:00:00.000Z","2023-03-23T20:00:00.000Z","2023-04-06T20:00:00.000Z","2023-04-20T20:00:00.000Z","2023-05-04T20:00:00.000Z","2023-05-18T20:00:00.000Z","2023-06-01T20:00:00.000Z","2023-06-15T20:00:00.000Z","2023-06-29T20:00:00.000Z"]

Which matches the timestamps that appear in the event array, also. Google is reporting the accurate GMT start times for each event:

"start":"2023-01-26T21:00:00.000Z"
"start":"2023-02-23T21:00:00.000Z"
"start":"2023-03-09T21:00:00.000Z"
"start":"2023-04-06T20:00:00.000Z"
"start":"2023-04-20T20:00:00.000Z"
"start":"2023-05-04T20:00:00.000Z"
"start":"2023-06-29T20:00:00.000Z"

But there is a DST offset being applied on top of that which seems to be causing the problem.

Another recurring event that I have, which displays correctly:

SUMMARY:***************
TRANSP:OPAQUE
ATTACH;*****************
END:VEVENT
BEGIN:VEVENT
DTSTART;TZID=America/Edmonton:20230504T083000
DTEND;TZID=America/Edmonton:20230504T090000
DTSTAMP:20230502T002658Z
UID:**************@google.com
X-GOOGLE-CONFERENCE:*****************
RECURRENCE-ID;TZID=America/Toronto:20230427T103000
CLASS:PRIVATE
CREATED:20230420T154505Z

Again, the DTSTART and DTEND are accurate. Note that the created and recurrence-id timestamps are after DST started.

[04.05.2023 09:40.53.238] [DEBUG] Processing entry...
[04.05.2023 09:40.53.240] [DEBUG] Event:
{"type":"VEVENT","params":[],"start":"2023-04-27T14:30:00.000Z","datetype":"date-time","end":"2023-04-27T15:00:00.000Z","rrule":{"_cache":{"all":false,"before":[],"after":[],"between":[]},"origOptions":{"tzid":"America/Toronto","dtstart":"2023-04-27T14:30:00.000Z","freq":2,"wkst":{"weekday":6},"until":"2023-08-31T00:00:00.000Z","byweekday":[{"weekday":3}]},"options":{"freq":2,"dtstart":"2023-04-27T14:30:00.000Z","interval":1,"wkst":6,"count":null,"until":"2023-08-31T00:00:00.000Z","tzid":"America/Toronto","bysetpos":null,"bymonth":null,"bymonthday":[],"bynmonthday":[],"byyearday":null,"byweekno":null,"byweekday":[3],"bynweekday":null,"byhour":[14],"byminute":[30],"bysecond":[0],"byeaster":null}},"dtstamp":"2023-05-02T00:26:58.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"*********","lastmodified":"2023-05-02T00:26:58.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********,"recurrences":{"2023-04-27":{"type":"VEVENT","params":[],"start":"2023-04-27T14:30:00.000Z","datetype":"date-time","end":"2023-04-27T15:00:00.000Z","dtstamp":"2023-05-02T00:26:58.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-04-27T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"*********","lastmodified":"2023-05-02T00:26:58.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********},"2023-05-04":{"type":"VEVENT","params":[],"start":"2023-05-04T14:30:00.000Z","datetype":"date-time","end":"2023-05-04T15:00:00.000Z","dtstamp":"2023-05-04T12:46:24.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-05-04T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"*********","lastmodified":"2023-05-04T12:46:24.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********},"2023-05-25":{"type":"VEVENT","params":[],"start":"2023-05-25T14:30:00.000Z","datetype":"date-time","end":"2023-05-25T15:00:00.000Z","dtstamp":"2023-05-02T00:27:07.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-05-25T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"********","lastmodified":"2023-05-02T00:27:07.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********},"2023-06-01":{"type":"VEVENT","params":[],"start":"2023-06-01T14:30:00.000Z","datetype":"date-time","end":"2023-06-01T15:00:00.000Z","dtstamp":"2023-05-02T00:27:07.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-06-01T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"*********","lastmodified":"2023-05-02T00:27:07.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********},"2023-07-06":{"type":"VEVENT","params":[],"start":"2023-07-06T14:30:00.000Z","datetype":"date-time","end":"2023-07-06T15:00:00.000Z","dtstamp":"2023-05-02T20:28:31.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-07-06T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"********","lastmodified":"2023-05-02T20:28:31.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********},"2023-07-27":{"type":"VEVENT","params":[],"start":"2023-07-27T14:30:00.000Z","datetype":"date-time","end":"2023-07-27T15:00:00.000Z","dtstamp":"2023-05-02T00:27:09.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-07-27T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"********","lastmodified":"2023-05-02T00:27:09.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********},"2023-08-03":{"type":"VEVENT","params":[],"start":"2023-08-03T14:30:00.000Z","datetype":"date-time","end":"2023-08-03T15:00:00.000Z","dtstamp":"2023-05-02T00:27:09.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-08-03T14:30:00.000Z","class":"PRIVATE","created":"2023-04-20T15:45:05.000Z","description":"*********","lastmodified":"2023-05-02T00:27:09.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","attach":*********}}}
04.05.2023 09:40.53.243] [DEBUG] Title: **************, with dates: ["2023-04-27T12:30:00.000Z","2023-05-04T12:30:00.000Z","2023-05-11T12:30:00.000Z","2023-05-18T12:30:00.000Z","2023-05-25T12:30:00.000Z","2023-06-01T12:30:00.000Z","2023-06-08T12:30:00.000Z","2>
[04.05.2023 09:40.53.243] [DEBUG] event.recurrences: [object Object]
....
[04.05.2023 09:40.53.246] [DEBUG]  recurring date is Thu May 04 2023 06:30:00 GMT-0600 (Mountain Daylight Time) offset is 360
[04.05.2023 09:40.53.246] [DEBUG]  recurring date is Thu May 04 2023 06:30:00 GMT-0600 (Mountain Daylight Time) offset is 6 Hour is 06
[04.05.2023 09:40.53.246] [DEBUG] Corrected startDate: Thu May 04 2023 06:30:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.53.246] [DEBUG] initial tz=America/Toronto
[04.05.2023 09:40.53.246] [DEBUG] corrected tz=America/Toronto
[04.05.2023 09:40.53.246] [DEBUG] start date/time=Thu Apr 27 2023 08:30:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.53.247] [DEBUG] start offset=-240
[04.05.2023 09:40.53.247] [DEBUG] start date/time w tz =Thu Apr 27 2023 08:30:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.53.247] [DEBUG] event date=Thu May 04 2023 06:30:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.53.247] [DEBUG] event offset=-240 hour=8 event date=Thu May 04 2023 06:30:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.53.247] [DEBUG] adjustHours=0
[04.05.2023 09:40.53.247] [DEBUG] duration: 1800000
[04.05.2023 09:40.53.248] [DEBUG] saving event: ********

The GMT timestamps for the event.recurrences object are also incorrect (08:30 MDT == 14:30 GMT), so this seems to be getting confused with the timezone where the event was created, however, this seems to be consistent at least, as the time does at least end up correct in the end. No DST offset is applied; both the start date/time and event date are showing MDT.

As a final comparison, here is a recurring event created during DST, with my local timezone:

BEGIN:VEVENT
DTSTART;TZID=America/Edmonton:20230512T160000
DTEND;TZID=America/Edmonton:20230512T164500
RRULE:FREQ=MONTHLY;BYMONTHDAY=12
DTSTAMP:20230426T042855Z
UID:*********@google.com
X-GOOGLE-CONFERENCE:***********
CLASS:PRIVATE
CREATED:20230426T042726Z
DESCRIPTION:**************
LAST-MODIFIED:20230426T042855Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:*****************
TRANSP:OPAQUE
END:VEVENT

Debug logs:

[04.05.2023 09:58.38.183] [DEBUG] Processing entry...
[04.05.2023 09:58.38.184] [DEBUG] Event:
{"type":"VEVENT","params":[],"start":"2023-05-12T22:00:00.000Z","datetype":"date-time","end":"2023-05-12T22:45:00.000Z","rrule":{"_cache":{"all":false,"before":[],"after":[],"between":[]},"origOptions":{"tzid":"America/Edmonton","dtstart":"2023-05-12T22:00:00.000Z","freq":1,"bymonthday":12},"options":{"freq":1,"dtstart":"2023-05-12T22:00:00.000Z","interval":1,"wkst":0,"count":null,"until":null,"tzid":"America/Edmonton","bysetpos":null,"bymonth":null,"bymonthday":[12],"bynmonthday":[],"byyearday":null,"byweekno":null,"byweekday":null,"bynweekday":null,"byhour":[22],"byminute":[0],"bysecond":[0],"byeaster":null}},"dtstamp":"2023-04-26T04:28:55.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","class":"PRIVATE","created":"2023-04-26T04:27:26.000Z","description":"*********","lastmodified":"2023-04-26T04:28:55.000Z","location":"","sequence":"0","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE","recurrences":{"2023-05-12":{"type":"VEVENT","params":[],"start":"2023-05-15T17:00:00.000Z","datetype":"date-time","end":"2023-05-15T17:45:00.000Z","dtstamp":"2023-04-26T04:28:56.000Z","uid":"*********@google.com","GOOGLE-CONFERENCE":"*********","recurrenceid":"2023-05-12T22:00:00.000Z","class":"PRIVATE","created":"2023-04-26T04:27:26.000Z","description":"*********","lastmodified":"2023-04-26T04:28:56.000Z","location":"","sequence":"1","status":"CONFIRMED","summary":"*********","transparency":"OPAQUE"}}}
[04.05.2023 09:40.52.860] [DEBUG] start: Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.860] [DEBUG] end:: Fri May 12 2023 16:45:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.860] [DEBUG] duration: 2700000
[04.05.2023 09:40.52.860] [DEBUG] title: ********************
[04.05.2023 09:40.52.860] [DEBUG] Search for recurring events between: Sun Mar 05 2023 00:00:00 GMT-0700 (Mountain Standard Time) and Sun Jul 02 2023 23:59:59 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.862] [DEBUG] Title: ***********, with dates: ["2023-05-12T22:00:00.000Z","2023-06-12T22:00:00.000Z"]
[04.05.2023 09:40.52.862] [DEBUG] event.recurrences: [object Object]
[04.05.2023 09:40.52.862] [DEBUG]  recurring date is Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time) offset is 360
[04.05.2023 09:40.52.862] [DEBUG]  recurring date is Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time) offset is 6 Hour is 16
[04.05.2023 09:40.52.862] [DEBUG] Corrected startDate: Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.862] [DEBUG] initial tz=America/Edmonton
[04.05.2023 09:40.52.862] [DEBUG] corrected tz=America/Edmonton
[04.05.2023 09:40.52.862] [DEBUG] start date/time=Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.863] [DEBUG] start offset=-360
[04.05.2023 09:40.52.863] [DEBUG] start date/time w tz =Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.863] [DEBUG] event date=Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.863] [DEBUG] event offset=-360 hour=16 event date=Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time)
[04.05.2023 09:40.52.863] [DEBUG] adjustHours=0
[04.05.2023 09:40.52.863] [DEBUG] duration: 2700000
[04.05.2023 09:40.52.863] [DEBUG] saving event: ***********

Here 16:00 is the correct start time, the GMT timestamp of 22:00, and the resulting start date/time of date/time=Fri May 12 2023 16:00:00 GMT-0600 (Mountain Daylight Time) are all correct.

@sdetweil
Copy link
Collaborator

sdetweil commented May 4, 2023

can u show the original with the rule

we have a problem with the rule library, which only deals w local time, and the calendar parser which uses tz/utc.

rrule returns the dates mangled
wrong day, right time. or right day wrong time
or right both... (most of the time)

the edge cases are where the time and the tinezone offset cause overflow

@sdetweil
Copy link
Collaborator

sdetweil commented May 4, 2023

another issue, DST switching

the 1st event with trouble says
start date/time w tz =Thu Jan 12 2023 14:00:00 GMT- SO, pre-DST
but now is post-DST
sometimes the moment() gets it right, sometimes not.. hard to tell

@Ryanclbryant
Copy link
Author

Original with the rule, you mean the rrule options on this recurring event?
Cut out and formatted the details, but each of those sections are available above:

"rrule": {
    "_cache": {
      "all": false,
      "before": [],
      "after": [],
      "between": []
    },
    "origOptions": {
      "tzid": "America/Toronto",
      "dtstart": "2023-01-12T21:00:00.000Z",
      "freq": 2,
      "wkst": {
        "weekday": 6
      },
      "interval": 2,
      "byweekday": [
        {
          "weekday": 3
        }
      ]
    },
    "options": {
      "freq": 2,
      "dtstart": "2023-01-12T21:00:00.000Z",
      "interval": 2,
      "wkst": 6,
      "count": null,
      "until": null,
      "tzid": "America/Toronto",
      "bysetpos": null,
      "bymonth": null,
      "bymonthday": [],
      "bynmonthday": [],
      "byyearday": null,
      "byweekno": null,
      "byweekday": [
        3
      ],
      "bynweekday": null,
      "byhour": [
        21
      ],
      "byminute": [
        0
      ],
      "bysecond": [
        0
      ],
      "byeaster": null
    }

If I've completely misunderstood please just clarify which rule portion you're looking for and I can grab it!

The Jan 12 2023 dtstart is when this recurring meeting was originally started -- possibly in the process of going from UTC to local and back, something is accommodating for the fact that DST changed and subtracted an hour, and then calendar does it again deliberately to acknowledge the difference in offset?

For good measure, here is my config.js as it pertains to the calendar module:

 {
                        module: "calendar",
                        header: "Calendar",
                        position: "top_left",
                        config: {
                                maximumEntries: 2000,
                                broadcastPastEvents: true,
                                maximumNumberOfDays: 60,
                                calendars: [
                                        {
                                                url: "***********.ics",
                                                name: "family_calendar",
                                                color: "yellow"
                                        },
                                        {
                                                url: "*********.ics",
                                                name: "personal_calendar",
                                                color: "blue"
                                        },
                                        {
                                                url: "***********.ics",
                                                name: "work_calendar",
                                                broadcastPastEvents: false,
                                                color: "purple"
                                        },
                                        {
                                                url: "**********.ics",
                                                name: "new_family_calendar",
                                                color: "red"
                                        }
                                ],
                                excludedEvents: [*****],
                                showLocation: true,
                                fetchInterval: 1200000
                        }
                }

@sdetweil
Copy link
Collaborator

sdetweil commented May 4, 2023

no, the calendar event with the RRULE in it.. start on Jan 12 2023

you know you don't need to rsync unless u are trying to minimize network traffic and accept the delays in updates

but this shows too

"freq": 2,
      "wkst": {
        "weekday": 6
      },
      "interval": 2,
      "byweekday": [
        {
          "weekday": 3
        }
      ]

byweekday seems to be trouble for the RRULE with timezones

@Ryanclbryant
Copy link
Author

Ah! Yes here is the original event record:

BEGIN:VEVENT
DTSTART;TZID=America/Toronto:20230112T160000
DTEND;TZID=America/Toronto:20230112T170000
RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=2;BYDAY=TH
DTSTAMP:20230502T002659Z
UID:***********@google.com
X-GOOGLE-CONFERENCE:***********
CLASS:PRIVATE
CREATED:20230309T052934Z
DESCRIPTION:***********
LAST-MODIFIED:20230502T002659Z
LOCATION:
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:********
TRANSP:OPAQUE
END:VEVENT

Once upon a time I had a good reason for copying everything locally, can't remember what it was now, and it hasn't annoyed me enough yet to go through changing it

@sdetweil
Copy link
Collaborator

i believe if you take off the
BYDAY=TH
it will be ok

@sdetweil
Copy link
Collaborator

here is an updated test version of the fixes for all kinds of calendar date problems.

NOTE: the changed branch name
NOTE: this used the [email protected] library UNCHANGED

best to make a new folder and git clone there

git clone https://github.com/sdetweil/MagicMirror
cd MagicMirror
git checkout fixcaldates2 // <------ note this is a changed branch name
npm run install-mm
copy your config.js and custom.css from the prior folder
and the non-default modules you have installed…

this ONLY changes the default calendar
but DOES ship an updated node-ical library too

if you need to fall back, just rename the folders around again so that
your original is called MagicMirror

all the testcases for node-ical and MagicMirror execute successfully.

the ‘BIG’ change here is to get the local NON-TZ dates for the
rrule.between()

all the checking and conversion code is commented out or not used
the node-ical fixes are for excluded dates (exdate) values being adjusted for DST/STD time… waiting to submit that PR

one fix in calendar.js for checking if a past date was too far back,
but it never checked to see IF the event date was in the past… (before today) so it chopped off too many

and one change in calendarfetcher.js to put out a better diagnostic message of the parsed data… (exdate was excluded cause JSON stringify couldn’t convert the complex structure)

I added the tests you all have documented

please re-pull and checkout the new branch (I deleted the old branch)
and npm run install-mm again

@sdetweil sdetweil self-assigned this Oct 21, 2024
sdetweil added a commit that referenced this issue Jan 1, 2025
## [2.30.0] - 2025-01-01

Thanks to: @xsorifc28, @HeikoGr, @bugsounet, @khassel,
@KristjanESPERANTO, @rejas, @sdetweil.

> ⚠️ This release needs nodejs version `v20` or `v22 or higher`, minimum
version is `v20.18.1`

### Added

- [core] Add wayland and windows start options to `package.json` (#3594)
- [docs] Add step for npm publishing in release process (#3595)
- [core] Add GitHub workflow to run spellcheck a few days before each
release (#3623)
- [core] Add test flag to `index.html` to pass to module js for test
mode detection (needed by #3630)
- [core] Add export on animation names (#3644)
- [compliments] Add support for refreshing remote compliments file, and
test cases (#3630)
- [linter] Re-add `eslint-plugin-import`now that it supports ESLint v9
(#3586)
- [linter] Re-activate `eslint-plugin-package-json` to lint
`package.json` (#3643)
- [linter] Add linting for markdown files (#3646)
- [linter] Add some handy ESLint rules.
- [calendar] Add ability to display end date for full date events, where
end is not same day (showEnd=true) (#3650)
- [core] Add text to the config.js.sample file about the locale variable
(#3654, #3655)
- [core] Add fetch timeout for all node_helpers (thru undici, forces
node 20.18.1 minimum) to help on slower systems. (#3660) (3661)

### Changed

- [core] Run code style checks in workflow only once (#3648)
- [core] Fix animations export #3644 only on server side (#3649)
- [core] Use project URL in fallback config (#3656)
- [core] Fix Access Denied crash writing js/positions.js (on synology
nas) #3651. new message, MM starts, but no modules showing (#3652)
- [linter] Switch to 'npx' for lint-staged in pre-commit hook (#3658)

### Removed

- [tests] Remove `node-pty` and `drivelist` from rebuilded test (#3575)
- [deps] Remove `@eslint/js` dependency. Already installed with `eslint`
in deep (#3636)

### Updated

- [repo] Reactivate `stale.yaml` as GitHub action to mark issues as
stale after 60 days and close them 7 days later (if no activity) (#3577,
#3580, #3581)
- [core] Update electron dependency to v32 (test electron rebuild) and
all other dependencies too (#3657)
- [tests] All test configs have been updated to allow full external
access, allowing for easier debugging (especially when running as a
container)
- [core] Run and test with node 23 (#3588)
- [workflow] delete exception `allow-ghsas: GHSA-8hc4-vh64-cxmj` in
`dep-review.yaml` (#3659)

### Fixed

- [updatenotification] Fix pm2 using detection when pm2 script is inside
or outside MagicMirror root folder (#3576) (#3605) (#3626) (#3628)
- [core] Fix loading node_helper of modules: avoid black screen, display
errors and continue loading with next module (#3578)
- [weather] Change default value for weatherEndpoint of provider
openweathermap to "/onecall" (#3574)
- [tests] Fix electron tests with mock dates, the mock on server side
was missing (#3597)
- [tests] Fix testcases with hard coded Date.now (#3597)
- [core] Fix missing `basePath` where `location.host` is used (#3613)
- [compliments] croner library changed filenames used in latest version
(#3624)
- [linter] Fix ESLint ignore pattern which caused that default modules
not to be linted (#3632)
- [core] Fix module path in case of sub/sub folder is used and use
path.resolve for resolve `moduleFolder` and `defaultModuleFolder` in
app.js (#3653)
- [calendar] Update to resolve issues #3098 #3144 #3351 #3422 #3443
#3467 #3537 related to timezone changes
- [calendar] Fix #3267 (styles array), also fixes event with both exdate
AND recurrence(and testcase)
- [calendar] Fix showEndsOnlyWithDuration not working, #3598, applies
ONLY to full day events
- [calendar] Fix showEnd for Full Day events (#3602)
- [tests] Suppress "module is not defined" in e2e tests (#3647)
- [calendar] Fix #3267 (styles array, really this time!)
- [core] Fix #3662 js/positions.js created incorrectly

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Michael Teeuw <[email protected]>
Co-authored-by: Kristjan ESPERANTO <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Karsten Hassel <[email protected]>
Co-authored-by: Ross Younger <[email protected]>
Co-authored-by: Veeck <[email protected]>
Co-authored-by: Bugsounet - Cédric <[email protected]>
Co-authored-by: jkriegshauser <[email protected]>
Co-authored-by: illimarkangur <[email protected]>
Co-authored-by: vppencilsharpener <[email protected]>
Co-authored-by: veeck <[email protected]>
Co-authored-by: Paranoid93 <[email protected]>
Co-authored-by: Brian O'Connor <[email protected]>
Co-authored-by: WallysWellies <[email protected]>
Co-authored-by: Jason Stieber <[email protected]>
Co-authored-by: jargordon <[email protected]>
Co-authored-by: Daniel <[email protected]>
Co-authored-by: Ryan Williams <[email protected]>
Co-authored-by: Panagiotis Skias <[email protected]>
Co-authored-by: Marc Landis <[email protected]>
Co-authored-by: HeikoGr <[email protected]>
Co-authored-by: Pedro Lamas <[email protected]>
Co-authored-by: veeck <[email protected]>
@sdetweil sdetweil closed this as completed Jan 1, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants