Art*_*tem 0 iphone cocoa-touch ios
在我的应用程序中,我需要以编程方式在日历中创建一个事件,所有算法都围绕方法创建的日期工作+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds.但是使用这种方法我无法创建一个事件,似乎它没有在某个地方设置时区,因为使用其他方法(即[NSDate date])成功创建了事件.
我的解决方案是转换NSDate为CFGregorianDate,设置时区并转换回来.我想这似乎有点长.
代码段:
EKEvent *event = [EKEvent eventWithEventStore:eventStore];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:1322045010]; // interval is in seconds
NSLog(@"%@", date);
event.title = @"Test";
event.startDate = date;
event.endDate = date;
[event setCalendar:[eventStore defaultCalendarForNewEvents]];
[event addAlarm:[EKAlarm alarmWithAbsoluteDate:date]];
[eventStore saveEvent:event span:EKSpanThisEvent error:nil];
Run Code Online (Sandbox Code Playgroud)
所以我的问题是 - 为什么不能创建一个NSDate初始化的事件+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds?如果有人建议更有力的方法来解决这个问题,我将非常感激.
阿尔乔姆
当你这样说时,你的错误就会显露出来:"它似乎没有在某个地方设置时区,因为使用其他方法(即[NSDate date])成功创建了事件."
其中没有NSDate任何时区信息.他们都参考了GMT.该NSDateFormatter班是通常用来代表他们在当地时区.根据你对上述评论的回答,我怀疑你现在相信我.测试一下,用某种方法运行这行代码.
NSLog(@"[NSDate date] = %@",[NSDate date]);
Run Code Online (Sandbox Code Playgroud)
根据您的用户资料,您在爱沙尼亚.通过我的快速搜索,你应该是格林尼治标准时间+2:00(如果我在你的时区错了,我很抱歉)所以你在控制台看到的时间应该落后2个小时.而且我确信它是.和我的一样,提前5个小时.
您也可以通过您的解决方案告诉我:"我的解决方案是将NSDate转换为CFGregorianDate,设置时区并转换回来.我想这似乎有点长." 所以基本上你调整了时区,它工作正常,有道理.
但是对于你真正的问题'有人会建议一种更强大的方法来解决这个问题吗?' 答案相对简单.
假设您的服务器在爱沙尼亚时间(东欧?)返回自1970年以来的时间间隔.您所要做的就是调整该时间间隔以指向GMT时间.如果我对你所在时区的具体细节错了,我会再次道歉.
NSTimeInterval estoniaTimeZoneDifference = 60*60*2;//60 seconds, 60 minutes, 2 hours
NSDate *adjusted = [NSDate dateWithTimeIntervalSince1970:(timeIntervalSince1970FromServer - estoniaTimeZoneDifference)];
// Here we subtract because this zone is 2 hours ahead of GMT.
Run Code Online (Sandbox Code Playgroud)
此调整将再次索引到服务器响应.
编辑:回应:
我同意你的答案的一些观点,但尝试在你刚创建的日期创建一个事件,我打赌你做这件事的机会不是很好.
引用一个众所周知的电视角色"接受挑战!".
所以我开始测试是否可以使用成功创建事件dateWithTimeIntervalSince1970:.正如我所料,我发现在NSDate或EventKit框架中没有任何缺陷.我用过这段代码:
NSTimeInterval rightNowInterval = [[NSDate date] timeIntervalSince1970];
//NSTimeInterval is a double, thus nothing up my sleeve.
NSTimeInterval intervalSince70ToFire = rightNowInterval + 120;
// Two minutes from whenever now is. Plus this is another layer of indirection to prove there's no 'magic' to [NSDate date]
//Create fire date from dateWithTimeIntervalSince1970
NSDate *fireDate = [NSDate dateWithTimeIntervalSince1970:intervalSince70ToFire];
// Insert boilerplate event code
EKEventStore *eventSotre = [[EKEventStore alloc] init];
EKEvent *event = [EKEvent eventWithEventStore:eventSotre];
event.title= @"Event Title";
event.startDate = fireDate;
event.endDate= [[NSDate alloc] initWithTimeInterval:600 sinceDate:event.startDate];
[event addAlarm:[EKAlarm alarmWithAbsoluteDate:fireDate]];
event.calendar = [eventSotre defaultCalendarForNewEvents];
NSError *err = nil;
if([eventSotre saveEvent:event span:EKSpanThisEvent error:&err]){
UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:@"Event added in calendar" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertview show];
}
else{
UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Event" message:[err description] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertview show];
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我收到"日历中添加的事件"消息.这两分钟给了我足够的时间去日历,看到事件已经正确安排.然后退出并等待我的闹钟响起.确实如此.
| 归档时间: |
|
| 查看次数: |
3366 次 |
| 最近记录: |