Это, вероятно, проблема в вашем часовом поясе. Обратите внимание, что при анализе даты без времени предполагается, что время равно нулю. Однако некоторые конкретные времена не существуют, как правило, из-за изменения времени перехода на летнее время (которые происходят в марте по всему миру) или из-за конкретных локальных изменений времени.
Например, в Иордании изменение DST Apr 1 2016, 00:00 => Apr 1 2016, 01:00
. Это означает, что время Apr 1 2016, 00:00
не существует, потому что March 31 2016, 23:59
становится немедленно Apr 1 2016, 01:00
. Если дата не существует, форматировщик даты должен возвращать nil
.
Обычно вы можете исправить эту проблему, используя предустановленный часовой пояс GMT, который не имеет этой проблемы, например
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
или
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[NSTimeZone systemTimeZone].secondsFromGMT];
Обратите внимание, что поскольку вы не занимаетесь анализом времени, различия в часовых поясах не должны влиять на вас.
Шаги по воспроизведению
Установите часовой пояс на вашей машине в иорданский часовой пояс:
NSString *dateString = @"2016-04-01";
NSDateFormatter* parsingFormatter = [[NSDateFormatter alloc] init];
parsingFormatter.dateFormat = @"yyyy-MM-dd";
NSLog(@"Parsed: %@", [parsingFormatter dateFromString:dateString]); // "(null)"
с исправлением часового пояса:
NSString *dateString = @"2016-04-01";
NSDateFormatter* parsingFormatter = [[NSDateFormatter alloc] init];
parsingFormatter.dateFormat = @"yyyy-MM-dd";
parsingFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSLog(@"Parsed: %@", [parsingFormatter dateFromString:dateString]); // "2016-04-01 00:00:00 +0000"