NSDateFormatter dateFromString всегда возвращает ноль

Я хочу заранее извиниться за задание повторного вопроса, но ни один из других решений для меня не работал. Каждый раз, когда я пытаюсь передать строку даты в функцию dateFromString, я получаю нуль. Я не читал ничего, что изменилось с момента обновления iOS 7, но я постоянно обновляюсь, если это имеет значение, независимо от того, работает ли это по-прежнему одинаково.

Это код, который я использую для создания даты из строки:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale systemLocale]];
    [dateFormat setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
    [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];

    NSDate *date = [[NSDate alloc] init];
    date = [dateFormat dateFromString:dateString];

    return date;

Я установил свой dateFormat на основе всех решений, которые я прочитал, чтобы решить эту проблему, но ни один из этих параметров не решил проблему. SystemLocale определенно настроен для английского языка, поэтому он не должен вызывать никаких проблем.

Это dateString, я передаю dateFromString:

Wednesday, October 9, 2013 at 2:40:29 PM Pacific Daylight Time

Спасибо за помощь!

Ответ 1

Здесь есть две проблемы:

  • Формат строки даты, ожидающий форматирования (@"yyyy-MM-dd hh:mm:ss"), отличается от формата строки даты, которую вы пытаетесь проанализировать (@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz").

  • Установка языкового стандарта форматирования в [NSLocale systemLocale] приводит к возврату [dateFormat dateFromString:] nil. Установите значение [NSLocate currentLocale].

Полный код для форматирования должен быть:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale currentLocale]];
    [dateFormat setDateFormat:@"EEEE, MMMM d, yyyy 'at' h:mm:ss a zzzz"];
    [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];

    NSDate *date = [dateFormat dateFromString:dateString];

Ответ 2

Еще один способ получить нуль - использовать hh, а ваши часы - 24 часа в час и > 12, в этом случае вам понадобится hh (или H для нулевого заполнения).

То есть:

  • Формат: yyyy-MM-DD hh: mm: ss, string: "2016-03-01 13:42:17" будет возвращать nil
  • Формат: yyyy-MM-DD HH: mm: ss, string: "2016-03-01 13:42:17" вернет ожидаемую дату.

Шляпа к @neilco (см. комментарии ниже его ответа) для этого. Если вам нравится этот ответ, пожалуйста, проголосуйте также за него.

Ответ 3

Согласно Документация NSDateFormatter:

При работе с датами фиксированного формата, такими как RFC 3339, вы устанавливаете Формат даты  чтобы указать строку формата.

Если ваш формат даты 2017-06-16T17:18:59.082083Z, то свойство dateFormat должно выглядеть так: yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ.

Swift 3

let dateFormatter = DateFormatter()
let date = "2017-06-16T17:18:59.082083Z"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"

let result = dateFormatter.date(from: date) // 2017-06-16 17:18:59 +0000

Ответ 4

Формат вашей даты не соответствует строке, которую вы передаете, ваша dateString должна находиться в этом formate в соответствии с вашим [dateFormat setDateFormat: @ "yyyy-MM-dd hh: mm: ss" ];

2013-10-09 02:40:29

nil означает, что объект DateFormat не смог выполнить синтаксический анализ вашей строки.

Ответ 5

Вы пытаетесь использовать dateFromString, но формат, который вы передали в Formatter, отличается от того, что вы используете в dateString.

Попробуйте использовать эту конфигурацию в вашем формате даты: E',' M d',' yyyy 'at' hh:mm:ss aa z

Ответ 6

Я пытаюсь преобразовать 2018-12-04T02: 01: 06.212, используя DateFormatter. Пробовал несколько вещей, но значение даты всегда возвращает нуль. Есть ли что-то, что мне не хватает?

    let savedTime = 2018-12-04T02:01:06.212
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    let date = dateFormatter.date(from: savedTime!)