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

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

5 ответов

Решение

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

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

  2. Установка языка форматирования на [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];

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

То есть:

  • Формат: гггг-мм-дд чч: мм: сс, строка: "2016-03-01 13:42:17" вернет ноль
  • Формат: гггг-ММ-ДД ЧЧ: мм: сс, строка: "2016-03-01 13:42:17" вернет ожидаемую дату.

Хэт-чаевые @neilco (см. Комментарии ниже его ответа) для этого. Если вам нравится этот ответ, пожалуйста, проголосуйте за него тоже.

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

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

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

Свифт 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

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

2013-10-09 02:40:29

nil означает, что объекту dateFormat не удалось проанализировать вашу строку.

На случай, если кто-то застрял в том же забавном пограничном случае, что и я:

"2020-03-08T02:00: 00" вернется nil пока вы находитесь в регионе, который следует за летним временем, потому что этот час пропускается и просто не существует.

Не забывай сбежать "yyyy/MM/dd' 'HH:mm:ss" символы пробела

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

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

Другие вопросы по тегам