После дополнительных исследований, код, который я здесь использую, работает, но подозрительно;
NSString *purchaseDateString = [@"2011-05-24 19:02:32 Etc/GMT" stringByReplacingOccurrencesOfString:@" Etc/GMT" withString:@""];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSLocale *POSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
[formatter setLocale:POSIXLocale];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *purchaseDate = [formatter dateFromString:purchaseDateString];
Мне не нравятся предположения, которые я делаю относительно входящей строки даты, и поэтому я предполагаю, что этот код может сломаться для других магазинов (я тестирую против британского). Поэтому, хотя этот вид работает для моей собственной ситуации, я действительно хотел бы увидеть более надежное решение, которое действительно правильно анализирует строку часового пояса согласно исходному вопросу.
Я не могу поверить, что Apple использовала устаревший часовой пояс (все Etc / * официально объявлены устаревшими) в этих важных строках даты!
EDIT:
Замечу, что вы используете
NSDictionary *receiptData = [info valueForKey:@"expires_date"];
На самом деле это не строка согласно документации это должно быть "Дата истечения срока действия подписки, выраженная в виде количества миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу"
Однако вопрос по-прежнему актуален, так как при работе с восстановленными подписками необходимо использовать поле purchase_date, и это поле имеет текстовый формат, который вы описали.