如果我在 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/