From d11e4e5c92374b58dddfa0e96a415bc7e952f789 Mon Sep 17 00:00:00 2001 From: Sam Detweiler Date: Tue, 23 Mar 2021 08:44:14 -0500 Subject: [PATCH] refix #2483 , recurring FULL Day event, start date before 2007 --- CHANGELOG.md | 1 + modules/default/calendar/calendarutils.js | 67 ++++++++++++++--------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91635643..e5ae8ed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ _This release is scheduled to be released on 2021-04-01._ - Fix weather module openweathermap not loading if lat and lon set without onecall. - Fix calendar daylight savings offset calculation if recurring start date before 2007 - Fix calendar time/date adjustment when time with GMT offset is different day (#2488) +- Fix calendar daylight savings offset calculation if recurring FULL DAY start date before 2007 (#2483) ## [2.14.0] - 2021-01-01 diff --git a/modules/default/calendar/calendarutils.js b/modules/default/calendar/calendarutils.js index fc45d583..223dfb26 100644 --- a/modules/default/calendar/calendarutils.js +++ b/modules/default/calendar/calendarutils.js @@ -300,29 +300,43 @@ const CalendarUtils = { // this will be the correction we need to apply let nowOffset = new Date().getTimezoneOffset(); // for full day events, the time might be off from RRULE/Luxon problem + // get time zone offset of the rule calculated event + let dateoffset = date.getTimezoneOffset(); + // reduce the time by the offset + Log.debug(" recurring date is " + date + " offset is " + dateoffset); + let dh = moment(date).format("HH"); + Log.debug(" recurring date is " + date + " offset is " + dateoffset / 60 + " Hour is " + dh); if (CalendarUtils.isFullDayEvent(event)) { Log.debug("fullday"); // if the offset is negative, east of GMT where the problem is - if (date.getTimezoneOffset() < 0) { - Log.debug("now offset is " + nowOffset); - // reduce the time by the offset - Log.debug(" recurring date is " + date + " offset is " + date.getTimezoneOffset()); - // apply the correction to the date/time to get it UTC relative - date = new Date(date.getTime() - Math.abs(nowOffset) * 60000); - // the duration was calculated way back at the top before we could correct the start time.. - // fix it for this event entry - duration = 24 * 60 * 60 * 1000; - Log.debug("new recurring date is " + date); + if (dateoffset < 0) { + // if the date hour is less than the offset + if (dh < Math.abs(dateoffset / 60)) { + // reduce the time by the offset + Log.debug(" recurring date is " + date + " offset is " + dateoffset); + // apply the correction to the date/time to get it UTC relative + date = new Date(date.getTime() - Math.abs(nowOffset) * 60000); + // the duration was calculated way back at the top before we could correct the start time.. + // fix it for this event entry + //duration = 24 * 60 * 60 * 1000; + Log.debug("new recurring date1 is " + date); + } + } else { + // if the timezones are the same, correct date if needed + if (event.start.tz === moment.tz.guess()) { + // if the date hour is less than the offset + if (24 - dh < Math.abs(dateoffset / 60)) { + // apply the correction to the date/time back to right day + date = new Date(date.getTime() + Math.abs(24 * 60) * 60000); + // the duration was calculated way back at the top before we could correct the start time.. + // fix it for this event entry + //duration = 24 * 60 * 60 * 1000; + Log.debug("new recurring date2 is " + date); + } + } } } else { // not full day, but luxon can still screw up the date on the rule processing - // get time zone offset of the rule calculated event - let dateoffset = date.getTimezoneOffset(); - // reduce the time by the offset - Log.debug(" recurring date is " + date + " offset is " + dateoffset); - let dh = moment(date).format("HH"); - Log.debug(" recurring date is " + date + " offset is " + dateoffset / 60 + " Hour is " + dh); - // we need to correct the date to get back to the right event for if (dateoffset < 0) { // if the date hour is less than the offset @@ -337,14 +351,17 @@ const CalendarUtils = { Log.debug("new recurring date1 is " + date); } } else { - // if the date hour is less than the offset - if (24 - dh < Math.abs(dateoffset / 60)) { - // apply the correction to the date/time back to right day - date = new Date(date.getTime() + Math.abs(24 * 60) * 60000); - // the duration was calculated way back at the top before we could correct the start time.. - // fix it for this event entry - //duration = 24 * 60 * 60 * 1000; - Log.debug("new recurring date2 is " + date); + // if the timezones are the same, correct date if needed + if (event.start.tz === moment.tz.guess()) { + // if the date hour is less than the offset + if (24 - dh < Math.abs(dateoffset / 60)) { + // apply the correction to the date/time back to right day + date = new Date(date.getTime() + Math.abs(24 * 60) * 60000); + // the duration was calculated way back at the top before we could correct the start time.. + // fix it for this event entry + //duration = 24 * 60 * 60 * 1000; + Log.debug("new recurring date2 is " + date); + } } } }