На самом деле я не вижу связи между методом midnightUTC и предоставленным вами кодом.
В любом случае, проблема с данным примером заключается в том, что при разборе строки 4/18/11
будут отсутствовать значения по умолчанию, такие как минуты и т. Д. И ваш текущий часовой пояс, но строка будет приниматься как время по Гринвичу, поэтому это приведет к смещение вы видите.
Решение состоит в том, чтобы установить часовой пояс для NSDateFormatter. Посмотрите на этот код, я тестировал его минуту назад, и вывод на консоль. ааа показывает нечетное смещение, bbb выглядит как положено.
NSDateFormatter *dt = [[[NSDateFormatter alloc] init] autorelease];
[dt setDateStyle:NSDateFormatterShortStyle];
NSDate *aaa = [dt dateFromString:@"4/18/11"];
NSLog(@"1a. %@", [dt timeZone]);
NSLog(@"1b. %@", aaa);
[dt setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
NSDate *bbb = [dt dateFromString:@"4/18/11"];
NSLog(@"2a. %@", [dt timeZone]);
NSLog(@"2b. %@", bbb);
Консольный вывод
1a. Europe/Berlin (CEST) offset 7200 (Daylight)
1b. 2011-04-17 22:00:00 +0000
2a. GMT (GMT+00:00) offset 0
2b. 2011-04-18 00:00:00 +0000