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 вечера) - это, скорее всего, разница в часовом поясе, хотя она и не должна иметь значения.

Другие вопросы по тегам