1

如果我在 ICal 上创建一个新活动并将其设置为全天活动 - 我的应用程序显示它会持续 2 天。

我使用 nslog 输出 startdate 和 enddate,对于 2012 年 8 月 5 日的事件,我的应用程序说事件于 2012 年 9 月 5 日晚上 21 点(晚上 9 点)结束。

是什么导致了这种情况,以及将我的应用程序中的开始/结束日期转换为 iCal 上显示的相同值的最佳方法是什么。问题只存在于全天事件中。

4

2 回答 2

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 从事件的 endDate 返回 NSDate - 如果没有必要,保持不变 - 但如果需要 - 它将被修复。

于 2012-05-21T13:17:18.613 回答
1

据此: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 pm)只是时区的差异,即使 - 这不重要。

于 2012-05-21T12:09:46.260 回答