dateWithTimeIntervalSince1970在创建事件时不起作用

时间:2011-11-23 10:58:51

标签: iphone ios cocoa-touch

在我的应用程序中,我需要以编程方式在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的活动?如果有人建议更有力的方法来解决这个问题,我将非常感激。

阿尔乔姆

1 个答案:

答案 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];
}

当我运行此代码时,我会在日历中添加"事件"信息。这两分钟给了我足够的时间去日历,看到事件已经正确安排。然后退出并等待我的闹钟响起。确实如此。