NSDate хранит даты относительно стандартной контрольной даты.Из класса документов:
"Единственный примитивный метод NSDate, timeIntervalSinceReferenceDate, обеспечивает основу для всех других методов в интерфейсе NSDate. Этот метод возвращает значение времени относительно абсолютной ссылочной даты - первого моментаот 1 января 2001 года по Гринвичу. "
NSDate сама по себе не имеет понятия часовых поясов.Таким образом, NSDateFormatter сделал правильную вещь: он преобразовал дату, о которой вы сказали, что она имеет смещение по Гринвичу (указав часовой пояс), и дал вам «нормализованную» NSDate для этой даты.
Если вы хотитесм. дату, представленную в часовом поясе Европы / Будапешта, либо используйте существующий форматер даты (-stringFromDate :), либо соответствующий метод описания NSDate (например, -descriptionWithCalendarFormat: timeZone: locale:).
PS - Вы неВам вообще не нужен alloc / init в вашем коде, как написано.В не ARC это будет утечка.
PPS - Ваш формат даты неверен и дает бессмысленные результаты.Я пошел дальше и очистил ваш код следующим образом (проверено в ARC):
NSString *dateString = @"2011-09-02 17:49:54";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"Europe/Budapest"];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter setTimeZone:tz];
NSDate *date = [dateFormatter dateFromString:dateString];
NSLog(@"%@", [dateFormatter stringFromDate:date]);
NSLog(@"%@", [date descriptionWithCalendarFormat:nil timeZone:tz locale:nil]);