NSDateFormatter dateFromString выдает ноль после первого вызова в том же методе

#objective-c #nsdateformatter #xcode4.2

#objective-c #nsdateformatter #xcode4.2

Вопрос:

До Xcode 4 я использовал NSDate initFromString , но теперь он устарел и выдает ошибки в Xcode 4.2. Поэтому я перешел к использованию NSDateFormatter dateFromString , но столкнулся с проблемой в вызываемом мной методе, который получает дату восхода солнца из строки и дату захода солнца из строки, чтобы определить, день сейчас или ночь (таким же методом). Первый вызов работает нормально, но второй вызов возвращает nil. Я решил посмотреть, повторяется ли это, поэтому я создал следующий простой метод и загрузил его в другой проект в безобидном месте:

 - (void)testDateFormatter 
  {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    [formatter setDateFormat: @"yyyy-MM-dd hh:mm:ss Z"];
    NSString *srDateTimeString = @"2011-11-09 07:08:00 -0800";
    NSString *ssDateTimeString = @"2011-11-09 17:08:00 -0800";

    NSDate *sunriseDateTime = [formatter dateFromString: srDateTimeString];
    NSDate *sunsetDateTime  = [formatter dateFromString: ssDateTimeString];

    return;
  }
  

Первый вызов возвращает правильную дату. Второй вызов возвращает nil. Я пробовал несколько вариантов (таких как создание двух отдельных NSDateFormatters, предварительная инициализация дат, предварительная инициализация дат до текущего времени и последующее переназначение), но ни один из них не дает ожидаемого результата.

Кто-нибудь знает, что здесь происходит? Поскольку я нигде не нашел ссылки на эту ошибку, я отправил ее в Apple (ошибка # 10420498).

Jack

Комментарии:

1. когда я редактировал, я увидел, что у вас не было a () после testDateFormatter, это показалось опечаткой, поэтому я исправил это. просто чтобы вы знали.

2. @Anders, это не было опечаткой, Objective-C не помещает свои списки аргументов в круглые скобки.

3. Просто чтобы уточнить, вы создали два отдельных объекта NSDateFormatter, отправили им обоим dateFromString отдельно , с двумя отдельными строками, и это все равно произошло?

4. Да, я пробовал это. Я попробую это снова в тестовом методе прямо сейчас. Да, те же результаты. Просто добавил другой форматировщик и переименовал их оба в formatter1 и formatter2 и т.д. Первый работает нормально, второй равен нулю.

Ответ №1:

Во второй строке час равен 17 (24-часовой формат), но в строке формата используется hh (нижний регистр), что соответствует 12-часовому формату.

Измените строку формата на yyyy-MM-dd HH:mm:ss Z .

В документации см. раздел Форматирование даты, который содержит ссылку на шаблоны формата даты в Юникоде, в которых перечислены все спецификаторы формата.

Комментарии:

1. Что ж, теперь я чувствую себя глупо, но я также ценю исправление. Конечно, это работает нормально. Возможно ли, что когда initFromString все еще работал, hh с 24-часовыми часами все еще работал? Я спрашиваю только потому, что у меня есть ссылка на документ шаблонов формата даты Unicode прямо в моей документации по коду (чтобы мне не приходилось постоянно выяснять, где это находится). В любом случае, я сейчас исправлю свою ошибку в Apple.