提问人:jake1981 提问时间:5/21/2012 更新时间:5/23/2012 访问量:635
CalEvent 开始日期和结束日期与 iCal 和我的 App 的差异
CalEvent startdate and enddate differences with iCal and my app
问:
如果我在 ICal 上创建一个新事件并将其设置为全天事件 - 我的应用程序显示它持续 2 天。
我使用 nslog 输出开始日期和结束日期,对于 2012 年 5 月 8 日的事件,我的应用程序说事件于 2012 年 5 月 9 日 21.00(晚上 9 点)结束。
是什么原因导致的,以及将应用程序中的开始/结束日期转换为 iCal 上显示的相同值的最佳方法是什么。Promblem 仅存在于全天事件中。
答:
1赞
jake1981
5/21/2012
#1
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)只是时区的差异,即使 - 这应该无关紧要。
2赞
2 revsjake1981
#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 - 如果不需要,则保持不变 - 但如果需要 - 它将被修复。
评论