设置allday时EKEvent错误的日期

kos*_*kos 2 weekday ekevent

如果今天是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];
Run Code Online (Sandbox Code Playgroud)

结果于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];
Run Code Online (Sandbox Code Playgroud)

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

小智 8

背景

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

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

固定

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