Per impostazione predefinita, NSDateFormatter è impostato su localTimeZone. Poiché il tuo dateString non aveva informazioni sul fuso orario, ha calcolato l'ora rispetto a localTimeZone. Se sai che il fuso orario di dateString è UTC, devi impostarlo su dateFormatter.
NSDate rappresenta il tempo assoluto, la rappresentazione può variare rispetto ai fusi orari ma è un valore unico e non sarà influenzato dall'ora legale.
-(NSDate *)formatDateWithString:(NSString *)dateString{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate* date = [dateFormatter dateFromString:dateString];
NSLog(@"Formatted Timestamp: %@ - Original Timestamp: %@", date,dateString);
return date;
}