我需要使用 EventKit 框架在 iPhone 日历中输入条目。
由于我的应用程序应该是国际化的,因此我需要处理不同的时区。我现在在做什么:
活动应在早上 6:00 开始。因此,我正在使用以下代码创建一个 NSDate 对象:
[NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour,minute]];
我得到的是一个具有 06:00 am 和时区 GMT 的 NSDate 对象。
当将此 NSDate 用作事件的 startDate 时,我想使用系统时区,以确保事件在日历中真正显示为 06:00 am。
因此我使用这段代码:
+(NSDate*) convertToSystemTimezone:(NSDate*)sourceDate
{
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];
return destinationDate;
}
例如,我将设备时区更改为 NEW YORK。如果我调试代码,它会正确识别时区和 -14400 秒的偏移量。所以我的开始和结束 NSDate 对象似乎是正确的。
如果我查看日历,该应用程序创建了一个事件,该事件不是从上午 06:00 开始,而是从上午 04:00 开始。
我究竟做错了什么 ??
编辑:我创建事件的代码:
从 06:00 am 到 08:00 am 创建事件的示例
int year=2011;
int month=6;
int day=26;
int hour=6;
int minute=0;
NSDate *startDate = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour, minute];
startDate=[self convertToSystemTimezone:startDate];
NSDate *endDate = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,8, minute];
endDate=[self convertToSystemTimezone:endDate];
EKEventStore *eventDB = [[EKEventStore alloc] init];
EKEvent *myEvent = [EKEvent eventWithEventStore:eventDB];
myEvent.title = @"Testevent";
myEvent.startDate = startDate;
myEvent.endDate = endDate;
myEvent.allDay = NO;
[myEvent setCalendar:[eventDB defaultCalendarForNewEvents]];
NSError *err;
[eventDB saveEvent:myEvent span:EKSpanThisEvent error:&err];
[eventDB release];
现有事件的删除没有显示,但这是经过测试和工作的。