Jacob
Jacob

Reputation: 926

EKEventStore time zone isn't GMT

I'm trying to retrieve all the events for a single day from an instance of EKEventStore using eventsMatchingPredicate:, but as I read, the NSDate objects are by default set to GMT while the EKEventStore isn't. So my question is how do I change the timezone of the EKEventStore or adjust the NSDate objects so that the times aren't off for each timezone?

For example, I'm in GMT -0600, and clicking on January 16th and 17th in the TKCalendarMonthView I'm using for a calendar UI shows Martin Luther King Day on both dates. The start time is 6 AM on 16 January, and the end time is 5:59 AM on 17 January (as a result of my timezone), rather than beginning at 12:00 AM and lasting until 11:59 PM. The code used to retrieve events follows.

- (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];
}

Upvotes: 1

Views: 645

Answers (1)

Jacob
Jacob

Reputation: 926

Given that I'm on a short timeline, I came up with a solution, and it seems to work. My only concern is that I had to multiply the offset by -1 even though the time interval offset itself is negative. This doesn't make sense because we are trying to subtract from the NSDate rather than add to it. A positive number minus a negative number gives us a larger number, so I'm slightly worried about the GMT zones on the other side of the PM and wondering whether I should actually be multiplying all time intervals by -1. Anyone have any thoughts?

- (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];
}

Upvotes: 2

Related Questions