在我的应用程序中,我需要以编程方式在Calendar中创建一个事件,所有算法都围绕方法+ (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];
所以我的问题是 - 为什么无法创建NSDate
初始化为+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds
的活动?如果有人建议更有力的方法来解决这个问题,我将非常感激。
阿尔乔姆
答案 0 :(得分:7)
当你这样说时,你的错误就会显露出来:"它似乎没有在某个地方设置时区,因为使用其他方法(即[NSDate date]
)成功创建了事件。&# 34;
否NSDate
里面有任何时区信息。他们都参考了GMT。 NSDateFormatter
类通常用于在本地时区显示它们。根据你对上述评论的回答,我怀疑你现在相信我。测试一下,用某种方法运行这行代码。
NSLog(@"[NSDate date] = %@",[NSDate date]);
根据您的用户资料,您在爱沙尼亚。通过我的快速搜索,你应该是格林尼治标准时间+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.
此调整将再次索引到服务器响应。
修改:回复:
我同意你的答案的一些观点,但尝试创建一个事件 你刚刚创建的日期,我打赌你做这件事的机会不是很大 好。
引用一个知名的电视角色"接受挑战!"。
所以我开始测试是否可以使用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];
}
当我运行此代码时,我会在日历中添加"事件"信息。这两分钟给了我足够的时间去日历,看到事件已经正确安排。然后退出并等待我的闹钟响起。确实如此。