Вам не нужно заботиться о переходе на летнее время самостоятельно, «dateFormatter» сделает это автоматически для вас.Обычно вам нужен только объект NSDate во времени UTC (GMT + 0), а «dateFormatter», который также имеет часовой пояс, будет отображать это время в своем часовом поясе.
NSCalendar и NSDateFormatter имеют настройки часового пояса,NSDate - это просто момент времени относительно GMT + 0.
Пример: «Ожидаемая дата» - 1 января, 4:00 (GMT + 0). «DateFormatter» имеет часовой пояс GMT + 2 (например, Европа / Берлин),затем он будет выводить «1 января 6 утра» из-за своего собственного часового пояса при преобразовании «Ожидаемая дата» в строку.
Так что в основном вам просто нужно убедиться, что «startDate» правильно и что «григорианские» и «dateFormatter "использовать правильный часовой пояс.По умолчанию они используют системный часовой пояс, который, кажется, тот, который вы хотите использовать.Поэтому вам нужны только эти строки (и startDate должна быть правильной):
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *expectedDate = [gregorian dateByAddingComponents:components toDate:startDate options:0];
NSString *date = [dateFormatter stringFromDate:expectedDate];
Если это не сработает, пожалуйста, опубликуйте больше кода о том, как генерируются startDate и dateFormatter.