Search code examples
iosutcekeventstore

Handling Universal time (With T) while adding event to calendar Xcode


I'm trying to find the answer everywhere including StackOverflow.. I have a problem adding a time event from a string which looks like this: 2014-12-31T19:00:00-06:00. I'm parsing this from XML by the way. Rest of the code, including labels, etc. work fine.

So here is my code for adding a new events to the calendar (I tried to add 'dateFromString' already as a name with a current time to check and it goes through):

EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    if (!granted) { return; }
    EKEvent *event = [EKEvent eventWithEventStore:store];
    event.title = tempNameOfEvent;
    event.startDate = dateFromString; //here is a NSDate but incorrectly formatted
    event.endDate = [event.startDate dateByAddingTimeInterval:60*60];  //set 1 hour meeting
    [event setCalendar:[store defaultCalendarForNewEvents]];
    NSError *err = nil;
    [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
}];

Code from Programmatically add custom event in the iPhone Calendar

So, how should I format the NSDate to work with EKEventStore? Should I try to add it as "yyyy-MMM-dd HH:mm:ss ZZZ" which looks like "2007-01-09 17:00:00 +0000"? How to parse string and eliminate part with "-06:00"? (given time from XML looks like this: 2014-12-31T19:00:00-06:00).


Solution

  • You have the wrong format for the month, should be 'MM', missing quoting of the 'T' and adding a unneeded space prior to 'xxx'.

    Use: yyyy-MM-dd'T'HH:mm:ssxxx

    See: ICU Formatting Dates and Times
    Also: Date Field SymbolTable.

    Example:

    NSString *ds = @"2014-12-31T19:00:00-06:00";
    NSDateFormatter *df = [NSDateFormatter new];
    [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssxxx"];
    NSDate *d = [df dateFromString:ds];
    NSLog(@"d: %@", d);
    

    Output:

    d: 2015-01-01 01:00:00 +0000

    The output form is just the default display provided by NSDate, if you want a particular format use a NSDateFormatter to create the string to be displayed.

    Note that the date displayed is in UTC so it is in the next year for the supplied date. ;-)

    You probably do not want to eliminate the timezone, NSDates are the time since the first instant of 1 January 2001, GMT so the timezone is really necessary unless you are doing something rather non-standard.