设置allday时EKEvent错误的日期

时间:2014-05-06 18:10:41

标签: ekevent weekday

如果今天是5月6日星期二下午2点

event.startDate = [[NSDate alloc] init];
event.allDay = YES;
[dateFormat setDateFormat:EEEE, MMMM dd, yyyy];
NSString* dayStr = [dateFormat stringFromDate:event.startDate];
timeDetails.text = [NSString stringWithFormat:@"%@\nAll day", dayStr];

结果于5月5日星期一

没有allDay设置的相同代码

event.startDate = [[NSDate alloc] init];
[dateFormat setDateFormat:EEEE, MMMM dd, yyyy];
NSString* dayStr = [dateFormat stringFromDate:event.startDate];
timeDetails.text = [NSString stringWithFormat:@"%@\nAll day", dayStr];

结果于5月6日星期二这是正确的。 有人有任何线索吗?

2 个答案:

答案 0 :(得分:8)

<强>背景

在iOS中,所有日期都有时间组件。因此,对于一整天的活动,仍然会使用一些时间。通常这是午夜到“午夜之前”(23:59),这个事件的时间跨度将近24小时。

挑战来自时区和夏令时。这可能意味着全天活动从前一天晚上11点开始,到22:59结束。这一切都取决于您从哪里查看事件。不幸的是,在iOS开发中,这往往不明确!我有一些非常“有趣”的错误,只有在晚上11点到午夜之前运行应用程序时才能实现。

<强>修正

令人惊讶的是,EKEvent的行为会根据您设置属性的顺序而改变。如果您在之前设置event.allDay = YES ,则设置startDate然后您将获得您期望的行为。

答案 1 :(得分:1)

可能与时区有关。虽然无法确认,因为即使我尝试设置格式化程序时区,它仍然会产生同样的问题。更重要的是,我会假设如果我创建NSData并默认使用NSFormatter它将全部匹配。