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!)