我正在尝试使用eventsMatchingPredicate:从EKEventStore实例中检索一天中的所有事件,但正如我所读,默认情况下NSDate对象设置为GMT而EKEventStore不是。所以我的问题是如何更改EKEventStore的时区或调整NSDate对象,以便每个时区的时间不关闭?
例如,我在GMT -0600,点击1月16日和17日在我用于日历UI的TKCalendarMonthView中显示两个日期的Martin Luther King Day。开始时间是1月16日凌晨6点,结束时间是1月17日凌晨5点59分(由于我的时区),而不是从凌晨12:00开始,持续到晚上11:59。用于检索事件的代码如下。
- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
// Update tableData with event data from date
[tableData removeAllObjects];
NSArray *a = [systemCalendar eventsMatchingPredicate:[systemCalendar predicateForEventsWithStartDate:d endDate:[NSDate dateWithTimeInterval:84600 sinceDate:d] calendars:nil]];
[tableData addObjectsFromArray:a];
[self.eventsTable reloadData];
}
答案 0 :(得分:2)
鉴于我的时间很短,我想出了一个解决方案,它似乎有效。我唯一担心的是,即使时间间隔偏移本身为负,我也必须将偏移乘以-1。这没有意义,因为我们试图从NSDate中减去而不是添加它。正数减去负数会给我们一个更大的数字,所以我有点担心PM另一侧的GMT区域,并想知道我是否应该将所有时间间隔乘以-1。有人有什么想法吗?
- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)d {
[NSTimeZone resetSystemTimeZone];
NSTimeZone *tz = [NSTimeZone systemTimeZone];
NSArray *comps = [[tz description] componentsSeparatedByString:@" "];
NSTimeInterval offset = (NSTimeInterval)[[comps lastObject] floatValue];
if (offset < 0) {
offset *= -1;
}
NSDate *startDate = [d dateByAddingTimeInterval:offset];
NSArray *a = [systemCalendar eventsMatchingPredicate:[systemCalendar predicateForEventsWithStartDate:startDate endDate:[NSDate dateWithTimeInterval:84600 sinceDate:startDate] calendars:nil]];
NSLog(@"Events for the date: %@", a);
[tableData addObjectsFromArray:a];
[self.eventsTable reloadData];
}