fix(calendar): Repeated events didn't use the correct timezone in some cases

This commit is contained in:
Hivert Quentin
2023-07-12 15:00:24 +02:00
parent 57ba5397e5
commit bd8b49d2c9
4 changed files with 140 additions and 142 deletions
+33 -34
View File
@@ -85,13 +85,12 @@
tzId = [self value: 0 ofAttribute: @"tzid"];
if ([tzId length])
{
calendar
= (iCalCalendar *) [self searchParentOfClass: [iCalCalendar class]];
{
calendar = (iCalCalendar *) [self searchParentOfClass: [iCalCalendar class]];
timeZone = [calendar timeZoneWithId: tzId];
//if (!timeZone)
//[self logWithFormat: @"timezone '%@' not found in calendar", tzId];
}
}
return timeZone;
}
@@ -169,37 +168,37 @@
count = [subValues count];
dates = [NSMutableArray arrayWithCapacity: count];
for (i = 0; i < count; i++)
{
date = [subValues objectAtIndex: i];
iTZ = [self timeZone];
{
date = [subValues objectAtIndex: i];
iTZ = [self timeZone];
if (iTZ)
dateTime = [iTZ dateForDateTimeString: date];
else
{
initialDate = [date asCalendarDate];
if (initialDate)
dateTime = initialDate;
/*
{
if ([date hasSuffix: @"Z"] || [date hasSuffix: @"z"])
dateTime = initialDate;
else
{
// same TODO as above
tz = [NSTimeZone defaultTimeZone];
dateTime = [initialDate addYear: 0 month: 0 day: 0
hour: 0 minute: 0
second: -[tz secondsFromGMTForDate: initialDate]];
}
}
*/
else
dateTime = nil;
}
if (dateTime)
[dates addObject: dateTime];
}
if (iTZ)
dateTime = [iTZ dateForDateTimeString: date];
else
{
initialDate = [date asCalendarDate];
if (initialDate)
dateTime = initialDate;
/*
{
if ([date hasSuffix: @"Z"] || [date hasSuffix: @"z"])
dateTime = initialDate;
else
{
// same TODO as above
tz = [NSTimeZone defaultTimeZone];
dateTime = [initialDate addYear: 0 month: 0 day: 0
hour: 0 minute: 0
second: -[tz secondsFromGMTForDate: initialDate]];
}
}
*/
else
dateTime = nil;
}
if (dateTime)
[dates addObject: dateTime];
}
return dates;
}
+50 -44
View File
@@ -122,37 +122,44 @@
NSEnumerator *dateList;
NSCalendarDate *rDate;
NSString *dateString;
NSTimeZone *rdateTimezone;
int offset;
unsigned i;
if (theTimeZone)
{
dates = [NSMutableArray array];
dateList = [[self childrenWithTag: @"rdate"] objectEnumerator];
{
dates = [NSMutableArray array];
dateList = [[self childrenWithTag: @"rdate"] objectEnumerator];
while ((dateString = [dateList nextObject]))
{
rDates = [(iCalDateTime*) dateString dateTimes];
for (i = 0; i < [rDates count]; i++)
while ((dateString = [dateList nextObject]))
{
rDates = [(iCalDateTime*) dateString dateTimes];
for (i = 0; i < [rDates count]; i++)
{
rDate = [rDates objectAtIndex: i];
// Example: timezone is -0400, date is 2012-05-24 (00:00:00 +0000),
// and changes to 2012-05-24 04:00:00 +0000
if ([theTimeZone isKindOfClass: [iCalTimeZone class]])
{
rDate = [(iCalTimeZone *) theTimeZone computedDateForDate: rDate];
}
else
{
offset = [(NSTimeZone *) theTimeZone secondsFromGMTForDate: rDate];
rDate = (NSCalendarDate *) [rDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0
seconds:-offset];
}
if ((rdateTimezone =[rDate timeZone]))
{
//The property rdate can have the timezone, https://www.kanzaki.com/docs/ical/rdate.html
//In that case, dont force the
}
// Example: timezone is -0400, date is 2012-05-24 (00:00:00 +0000),
// and changes to 2012-05-24 04:00:00 +0000
else if ([theTimeZone isKindOfClass: [iCalTimeZone class]])
{
rDate = [(iCalTimeZone *) theTimeZone computedDateForDate: rDate];
}
else
{
offset = [(NSTimeZone *) theTimeZone secondsFromGMTForDate: rDate];
rDate = (NSCalendarDate *) [rDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-offset];
}
[(NSMutableArray *) dates addObject: rDate];
}
}
}
}
}
}
else
dates = [self recurrenceDates];
@@ -351,33 +358,32 @@
unsigned i;
if (theTimeZone)
{
dates = [NSMutableArray array];
dateList = [[self childrenWithTag: @"exdate"] objectEnumerator];
{
dates = [NSMutableArray array];
dateList = [[self childrenWithTag: @"exdate"] objectEnumerator];
while ((dateString = [dateList nextObject]))
{
exDates = [(iCalDateTime*) dateString dateTimes];
for (i = 0; i < [exDates count]; i++)
while ((dateString = [dateList nextObject]))
{
exDates = [(iCalDateTime*) dateString dateTimes];
for (i = 0; i < [exDates count]; i++)
{
exDate = [exDates objectAtIndex: i];
// Example: timezone is -0400, date is 2012-05-24 (00:00:00 +0000),
// and changes to 2012-05-24 04:00:00 +0000
if ([theTimeZone isKindOfClass: [iCalTimeZone class]])
{
exDate = [(iCalTimeZone *) theTimeZone computedDateForDate: exDate];
}
else
{
offset = [(NSTimeZone *) theTimeZone secondsFromGMTForDate: exDate];
exDate = (NSCalendarDate *) [exDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0
seconds:-offset];
}
// Example: timezone is -0400, date is 2012-05-24 (00:00:00 +0000),
// and changes to 2012-05-24 04:00:00 +0000
if ([theTimeZone isKindOfClass: [iCalTimeZone class]])
{
exDate = [(iCalTimeZone *) theTimeZone computedDateForDate: exDate];
}
else
{
offset = [(NSTimeZone *) theTimeZone secondsFromGMTForDate: exDate];
exDate = (NSCalendarDate *) [exDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-offset];
}
[(NSMutableArray *) dates addObject: exDate];
}
}
}
}
}
}
else
dates = [self exceptionDates];