dateWithTimeIntervalSince1970在创建事件时不起作用

Art*_*tem 0 iphone cocoa-touch ios

在我的应用程序中,我需要以编程方式在日历中创建一个事件,所有算法都围绕方法创建的日期工作+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds.但是使用这种方法我无法创建一个事件,似乎它没有在某个地方设置时区,因为使用其他方法(即[NSDate date])成功创建了事件.

我的解决方案是转换NSDateCFGregorianDate,设置时区并转换回来.我想这似乎有点长.

代码段:

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?如果有人建议更有力的方法来解决这个问题,我将非常感激.

阿尔乔姆

NJo*_*nes 7

当你这样说时,你的错误就会显露出来:"它似乎没有在某个地方设置时区,因为使用其他方法(即[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)

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