首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用NSTimezone的EventKit问题

使用NSTimezone的EventKit问题
EN

Stack Overflow用户
提问于 2011-06-26 08:49:13
回答 1查看 2.1K关注 0票数 3

我需要使用iPhone框架在EventKit日历中创建条目。

由于我的应用程序应该是国际的,我需要处理不同的时区。我现在在做的是:

活动应于上午6点开始。因此,我使用以下代码创建了一个NSDate对象:

代码语言:javascript
运行
复制
[NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour,minute]];

我得到的是一个NSDate对象与早上06:00和时区格林尼治时间。

当使用此NSDate作为事件的startDate时,我希望使用系统时区,以确保事件在日历中真正显示为上午06:00。

因此,我使用以下代码:

代码语言:javascript
运行
复制
+(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; 
}

例如,我将设备时区更改为纽约。如果调试到代码中,它将正确识别时区和偏移量-14400秒。因此,我的start和end NSDate对象似乎是正确的。

如果我查看日历,应用程序创建了一个事件,该事件不是从早上06:00开始,而是在上午04:00开始。

我做错什么了??

编辑:我创建事件的代码:

从早上06:00到上午8:00创建事件的示例

代码语言:javascript
运行
复制
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];

删除现有事件没有显示,但这是经过测试和工作的。

EN

回答 1

Stack Overflow用户

发布于 2011-06-26 09:05:45

如果要保留系统时区的时间,则执行以下操作,

代码语言:javascript
运行
复制
+(NSDate*) convertToSystemTimezone:(NSDate*)sourceDate {
    NSCalendar * calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    [calendar setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    NSUInteger flags = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit );
    NSDateComponents * dateComponents = [calendar components:flags fromDate:sourceDate];

    [calendar setTimeZone:[NSTimeZone systemTimeZone]];
    NSDate * myDate = [calendar dateFromComponents:dateComponents];

    return myDate;
}

但我认为你应该看看localTimeZone而不是systemTimeZone。如果是另一个,您可以在上面的代码段中更改它。

编辑

为什么你需要在格林尼治时间得到日期,然后转换它?你不能直接这么做吗?

initWithCalendarIdentifier:NSGregorianCalendar] NSCalendar =[NSCalendar alloc NSCalendar自动释放];

代码语言:javascript
运行
复制
NSDateComponents * dateComponents = [[[NSDateComponents alloc] init] autorelease];
[dateComponents setYear:2011];
[dateComponents setMonth:6];
[dateComponents setDay:26];
[dateComponents setHour:6];
[dateComponents setMinute:0];

NSDate * startDate = [calendar dateFromComponents:dateComponents];

[dateComponents setHour:8];
NSDate * endDate = [calendar dateFromComponents:dateComponents];

然后创建和保存EKEvent实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6483008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档