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 ответов
Здесь есть две проблемы:
Формат строки даты, которую ожидает форматтер (
@"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];
Еще один способ получить ноль, если вы используете 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
пока вы находитесь в регионе, который следует за летним временем, потому что этот час пропускается и просто не существует.
Вы пытаетесь использовать dateFromString, но формат, который вы передали вашему Formatter, отличается от того, что вы используете в dateString.
Попробуйте использовать этот конфиг в вашем формате даты: E',' M d',' yyyy 'at' hh:mm:ss aa z