gpt4 book ai didi

iphone - dateWithTimeIntervalSince1970 在创建事件时不起作用

转载 作者:行者123 更新时间:2023-11-28 18:14:09 24 4
gpt4 key购买 nike

在我的应用程序中,我需要以编程方式在日历中创建一个事件,所有算法都围绕方法 + (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];

所以我的问题是 - 为什么无法使用 + (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds 初始化的 NSDate 创建事件?并且有人可以建议更稳健的方法来解决这个问题,我将不胜感激。

艺术

最佳答案

当你这样说时,你的错误就暴露了:“似乎它没有在某处设置时区,因为使用其他方法(即 [NSDate date])事件已成功创建”

NSDate 中没有任何时区信息。它们都以 GMT 为引用。 NSDateFormatter 类通常用于在本地时区显示它们。从您对上述评论的回应来看,我怀疑您现在是否相信我。对此进行测试,以某种方法在某处运行这行代码。

NSLog(@"[NSDate date] = %@",[NSDate date]);

根据您的用户资料,您位于爱沙尼亚。通过我的快速搜索,你应该是 GMT+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.

同样,此调整将被索引到服务器响应。

编辑:响应:

I agree with some points of your answer, but try to create an event on the date you just created, I bet your chances to do it are not very good.

引用一个众所周知的电视角色“接受挑战!”。

所以我着手测试是否可以使用 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];
}

当我运行这段代码时,我收到了“事件已添加到日历中”的消息。这两分钟让我有足够的时间去查看日历并查看事件实际上是否已正确安排。然后退出并等待我的闹钟响起。确实如此。

关于iphone - dateWithTimeIntervalSince1970 在创建事件时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8241000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com