How to fix performance problems when using NSDateFormatter

Unfortunately the majority of web services return dates in the ISO-8601 format and not in time interval. So to parse the date we end up using NSDateFormatter which is extremely slow at doing that.

But there is a way for you to improve date parsing performance, you can use the SQLite library to make the conversion. You may have to write a few more lines to get the same result, but the performance gain is totally worth it.

Let's take this date as an example: 2013-09-07T23:45:00Z, if you want to convert that to time interval you could do this:

sqlite> SELECT strftime("%s", "2013-09-07T23:45:00Z");
1378597500

We can achieve the same result on iOS using the following code:

sqlite3_stmt *statement = NULL;
sqlite3_prepare_v2(db, "SELECT strftime('%s', ?);", -1, &statement, NULL);

sqlite3_bind_text(statement, 1, [dateString UTF8String], -1, SQLITE_STATIC);
sqlite3_step(statement);
sqlite3_int64 interval = sqlite3_column_int64(statement, 0);
NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];

If you want to compare the results, Anurag Mishradid a script to demonstrate this. In his tests the performance gain was 1400%, or from 106 seconds to just 7.

If you want to read more on how SQLite parses the date in it's C lirabry you can go here.