Проблема заключается в том, что от того, в каком штате Нью-Йорк на 4 или 5 часов отстает время по Гринвичу / UTC, зависит от того, используете ли вы в настоящее время летнее время или нет. В настоящее время у нас "летнее время", но при отсутствии информации об обратном форматер даты собирается принять дату 1 января 2000 года, которая не относится к летнему времени. Отсюда и отключение.
Но вы можете установить defaultDate
форматера на сегодня:
NSDate *today = [[NSCalendar currentCalendar] startOfDayForDate:[NSDate date]];
[dateFormatInput setDefaultDate:today];
Приведенный выше форматер будет иметь значение по умолчанию для сегодняшней даты. Очевидно, что если ваш ввод имеет отдельное поле, в котором указывается, какой день относится к этому времени, используйте его.
Но, установив defaultDate
, это позволит строке только для времени узнать, следует ли применять переход на летнее время или нет, давая желаемое преобразование часового пояса.
Кстати, я бы предложил не использовать dateFormat
для выходной строки. Укажите timeStyle
, и он будет отформатирован в соответствии с настройками устройства пользователя:
NSDateFormatter *dateFormatInputOutput = [[NSDateFormatter alloc] init];
[dateFormatInputOutput setTimeStyle:NSDateFormatterShortStyle];
return [dateFormatInputOutput stringFromDate:date];
В частности, если пользователь настроил свое устройство на 24-часовые часы, вышеприведенное будет учитывать все, что указал пользователь, вместо принудительного использования формата, который может быть ему не по вкусу.
Также обратите внимание, что вам не нужно принудительно устанавливать часовой пояс или локаль (если вы действительно не намеревались принудительно переводить его в Нью-Йорк, даже если пользователь находится в CA), поскольку он также по умолчанию будет использовать настройки устройства пользователя. Это зависит только от того, действительно ли вы хотели перевести его в восточный часовой пояс или нет.
Если вы читаете строки даты / времени из веб-службы, вы также можете указать согласованный языковой стандарт в соответствии с Техническим примечанием 1480 . Технически, это строка времени, это может не понадобиться, но это хорошая практика:
[dateFormatInput setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];