CalEvent: различия начальных и конечных дат с iCal и моим приложением
Если я создаю новое событие на ICal и задаю его как событие на весь день - мое приложение показывает, что оно длится 2 дня.
Я использовал nslog для вывода startdate и enddate, а для события 8.5.2012 мое приложение сообщает, что событие заканчивается 9.5.2012 в 21.00(21:00).
Что является причиной этого и каков наилучший способ преобразовать начало / конец в моем приложении в те же значения, которые отображаются в iCal. Проблема существует только в течение всего дня.
2 ответа
Хорошо... Здесь я сделал некоторые функции, чтобы другие люди, борющиеся с той же проблемой, могли легко получить некоторую помощь.
- (NSDate *)changeDayBy:(NSDate *)current:(NSUInteger) change
{
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setDay: change];
return [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:current options:0];
}
- (BOOL) endDateNeedsAFix:(CalEvent *)event
{
if ( !event.isAllDay )
return NO;
NSDateComponents *comps1 = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:event.startDate] ;
NSDateComponents *comps2 = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:event.endDate];
return [[[NSCalendar currentCalendar] dateFromComponents: comps2] timeIntervalSinceDate: [[NSCalendar currentCalendar] dateFromComponents: comps1]] / ( 60*60*24) > 0 ? YES : NO;
}
- (NSDate*) endDateFixed:(CalEvent *)event
{
if ( !event.isAllDay )
return event.endDate;
NSDateComponents *comps1 = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:event.startDate];
NSDateComponents *comps2 = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:event.endDate];
if ( [[[NSCalendar currentCalendar] dateFromComponents: comps2] timeIntervalSinceDate: [[NSCalendar currentCalendar] dateFromComponents: comps1]] / ( 60*60*24) > 0 )
return [self changeDayBy:event.endDate :-1];
return event.endDate;
}
Функция endDateNeedsAFix сообщает, требуется ли исправление для выбранного события calEvent *. Это полезно, если в приложении есть какой-то редактор событий, в котором конечная дата показывается фиксированной, перед сохранением изменений проверьте, нужно ли исправить, а затем используйте changeDayBy, чтобы добавить +1 к дате.
endDateFixed возвращает NSDate из endDate события - если не нужно, то есть без изменений - но при необходимости - оно будет исправлено.
Согласно этому: источник icalbuddy
if ([event isAllDay])
{
// all-day events technically span from <start day> at 00:00 to <end day+1> at 00:00 even though
// we want them displayed as only spanning from <start day> to <end day>
NSDate *endDateMinusOneDay = dateByAddingDays([event endDate], -1);
NSInteger daysDiff = getDayDiff([event startDate], endDateMinusOneDay);
if (daysDiff > 0)
{
elements.value = M_ATTR_STR((
strConcat(
dateStr([event startDate], ONLY_DATE),
@" - ",
dateStr(endDateMinusOneDay, ONLY_DATE),
nil
)
));
}
это должно действовать так, и мне нужно с этим справиться. Проблема со временем ( 21.00 / 9.00 вечера) - это, скорее всего, разница в часовом поясе, хотя она и не должна иметь значения.