Скопировано из аналогичного вопроса, на который я ответил здесь: NSDateFormatter возвращает nil для @ "dd-MM-yy" в iOS 3.0
Если вы работаете с видимыми пользователем датами, вам следует избегать установки строки формата даты. Форматирование дат таким способом не локализуемо и не позволяет предсказать, как ваша строка формата будет выражена во всех возможных пользовательских конфигурациях. Скорее, вы должны попытаться ограничить себя настройкой даты и времени (через - [NSDateFormatter setDateStyle:] и - [NSDateFormatter setTimeStyle:]).
С другой стороны, если вы работаете с датами фиксированного формата, вы должны сначала установить для локали форматера даты нечто подходящее для вашего фиксированного формата. В большинстве случаев лучшим языком для выбора является en_US_POSIX, язык, специально разработанный для получения результатов на английском языке США, независимо от пользовательских и системных предпочтений. «en_US_POSIX» также инвариантен во времени (если США в какой-то момент в будущем изменят способ форматирования дат, «en_US» изменится, чтобы отразить новое поведение, но «en_US_POSIX» не будет), и между компьютерами ( «en_US_POSIX» работает на iPhone OS так же, как на Mac OS X и на других платформах).
После того, как вы установили en_US_POSIX в качестве локали форматера даты, вы можете установить строку формата даты, и форматер даты будет работать согласованно для всех пользователей.
Приведенную выше информацию и многое другое можно найти в Apple Технические вопросы и ответы QA1480
Вот фрагмент кода из моего приложения, который реализует приведенную выше рекомендацию:
static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc]
initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil.");
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}