1

ICal で新しいイベントを作成し、それを終日イベントに設定すると、アプリはそれが 2 日間続くことを示します。

nslog を使用して startdate と enddate を出力し、2012 年 8 月 5 日のイベントの場合、アプリケーションはイベントが 2012 年 9 月 5 日の 21.00 (午後 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 に答える