xcode - CalEvent 开始日期和结束日期与 iCal 和我的应用程序的差异

标签 xcode cocoa nsdate icalendar calendar-store

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

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

导致此问题的原因以及将应用程序中的开始/结束日期转换为 iCal 上显示的相同值的最佳方法是什么。仅全天事件存在问题。

最佳答案

好的..在这里我做了一些功能,以便其他遇到同样问题的人可以轻松获得一些帮助。

- (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 - 如果不需要,则保持不变 - 但如果需要 - 它将被修复。

关于xcode - CalEvent 开始日期和结束日期与 iCal 和我的应用程序的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677232/

相关文章:

ios - 无法在 xcode 8.3.2 中更改 xib 文件方向

iphone - nsmutablearray 浮点对象返回零

objective-c - Cocoa:区分输入设备/scrollWheel:作为鼠标滚轮和触控板

objective-c - 找不到符号 : _OBJC_CLASS_$_Article

ios:提前 3 周(按日期)

ios - IOS NSDateFormatter问题

iphone - 如何添加以下额外的链接器标志?

ios - Swift 调用 setNavigationBarHidden 但 View 不会移动到顶部

macos - 以原子方式写入多个文件

arrays - 在 Swift 中对 NSDate 对象的一维数组进行排序