Parsing JSON dates on IPhone Parsing JSON dates on IPhone json json

Parsing JSON dates on IPhone


I just wrote this for iOS 4.0+ (because it uses NSRegularExpression). It handles dates with or without timezone offsets. Seems to work pretty well, what do you think?

+ (NSDate *)mfDateFromDotNetJSONString:(NSString *)string {    static NSRegularExpression *dateRegEx = nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        dateRegEx = [[NSRegularExpression alloc] initWithPattern:@"^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$" options:NSRegularExpressionCaseInsensitive error:nil];    });    NSTextCheckingResult *regexResult = [dateRegEx firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];    if (regexResult) {        // milliseconds        NSTimeInterval seconds = [[string substringWithRange:[regexResult rangeAtIndex:1]] doubleValue] / 1000.0;        // timezone offset        if ([regexResult rangeAtIndex:2].location != NSNotFound) {            NSString *sign = [string substringWithRange:[regexResult rangeAtIndex:2]];            // hours            seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:3]]] doubleValue] * 60.0 * 60.0;            // minutes            seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:4]]] doubleValue] * 60.0;        }        return [NSDate dateWithTimeIntervalSince1970:seconds];    }    return nil;}


I was in the same boat whilst using json-framework which doesn't support the date format as it's not official JSON. My source is from an API built using JSON.Net. This is what I came up with:

- (NSDate*) getDateFromJSON:(NSString *)dateString{    // Expect date in this format "/Date(1268123281843)/"    int startPos = [dateString rangeOfString:@"("].location+1;    int endPos = [dateString rangeOfString:@")"].location;    NSRange range = NSMakeRange(startPos,endPos-startPos);    unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];    NSLog(@"%llu",milliseconds);    NSTimeInterval interval = milliseconds/1000;    return [NSDate dateWithTimeIntervalSince1970:interval];}

I don't have the appended portion in the date format that you do so I haven't dealt with that like the answer above. No error catching either, it's all new to me at this point.


I actually found the snippet with NSRegularExpression pretty useful, till i came up with another solution that uses NSCharecterSet for stipping off the milliseconds.

+ (NSDate*) dateFromJSONString:(NSString *)dateString{    NSCharacterSet *charactersToRemove = [[ NSCharacterSet decimalDigitCharacterSet ] invertedSet ];    NSString* milliseconds = [dateString stringByTrimmingCharactersInSet:charactersToRemove];       if (milliseconds != nil && ![milliseconds isEqualToString:@"62135596800000"]) {        NSTimeInterval  seconds = [milliseconds doubleValue] / 1000;        return [NSDate dateWithTimeIntervalSince1970:seconds];    }    return nil;}

Saves a lot of the manual string processing and makes the code much cleaner.