Дата из String с использованием NSDateFormatter независимо от настройки 12 ч - 24 ч - PullRequest
3 голосов
/ 04 мая 2010

Сегодня мой вопрос о форматах даты и строках.Мое приложение загружает некоторые строки, представляющие даты из Интернета.Формат даты всегда такой: «2010-05-24 at 20:45» Мне нужно преобразовать эту строку в объект NSDate, чтобы выполнить некоторые манипуляции с датой.Я попробовал этот код:

NSString * dateString = @"2010-05-24 at 20:45" // actually downloaded from the internet
NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc] init];
[myDateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"];
NSDate * dateFromString = [myDateFormatter dateFromString:dateString];

Кажется, это работает идеально, если iPhone настроен на 24-часовые часы.Пока я переключаюсь на 12 часов в общих настройках, объект NSDate не создается (и приложение благополучно падает), я читал другие, имеющие подобные проблемы, но, похоже, я не нашел решения.Теперь вопросы: мне не имеет смысла, что NSDateFormatter чувствителен к пользовательским настройкам, пока я указываю, какой формат он должен использовать для разбора строки (который не может быть изменен, поскольку он поступает из Интернета)какая польза от проверки пользовательских настроек?Более важно, как я могу выполнить свою задачу (чтобы получить объект NSDate из строки независимо от настроек пользователя)?

Ответы [ 3 ]

5 голосов
/ 04 ноября 2010

Это объясняет причину этой проблемы и способы ее решения.

4 голосов
/ 28 апреля 2011
NSString * dateString = @"2010-05-24 at 20:45" // actually downloaded from the internet
NSDateFormatter * myDateFormatter = [[NSDateFormatter alloc] init];
[myDateFormatter setDateFormat:@"yyyy-MM-dd 'at' hh:mm"];
NSDate * dateFromString = [myDateFormatter dateFromString:dateString];

используйте «чч» вместо «ЧЧ» в настройке формата даты

1 голос
/ 15 марта 2017

Я нашел эту статью от Apple, которая объясняет именно эту проблему! (https://developer.apple.com/library/content/qa/qa1480/_index.html)

но в любом случае, краткий ответ заключается в том, что вам нужно установить локаль "en_US_POSIX", чтобы она работала с любыми заданными пользователем конфигами, связанными с датой.

let stringDate = "2017-03-15T11:37:16-03:00" // ISO8601 formatted string

let iso8601Formatter = DateFormatter()
iso8601Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
iso8601Formatter.locale = Locale(identifier: "en_US_POSIX")
iso8601Formatter.date(from: stringDate)
...