Почему мой NSDateFormatter иногда возвращает a.m или p.m. с yyyyMMddHHmmssSSS? - PullRequest
5 голосов
/ 16 августа 2011

Иногда мой код возвращает номер утра или часа. но не всегда. Большую часть времени он просто возвращает то, что я ожидаю, что-то вроде: 20110815170852164

Но иногда он возвращается: 20100412010241 утра. 450

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyyMMddHHmmssSSS"];
NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];

Что может быть причиной этого? Конкретные настройки даты / времени в стране для пользователей iPhone? Я передаю это тысячам людей, и большинство из них не возвращают утра (что ожидается), а другие. ПОЧЕМУ?

Ответы [ 3 ]

14 голосов
/ 16 августа 2011

Проблема, которую вы описываете, является известной ошибкой. Ознакомьтесь с обсуждением проблемы, связанной со стековым потоком , и вы можете найти там несколько возможных способов ее обхода.

Вот выдержка из объяснения Хайза об ошибке:

Проблема возникает из-за того, что NSDateFormatter «застревает» в 12- или 24-часовом режиме, который пользователь выбрал вручную.Так, если французский пользователь вручную выбирает 12-часовой режим, и приложение запрашивает NSDateFormatter для вывода времени с 24-часовым форматом «ЧЧмм», оно фактически получит время в 12-часовом формате, например, «01:00 PM»,как будто приложение вместо этого запросило «хмммм аа».Обратное произойдет, если пользователь из США выберет 24-часовой режим вручную: вывод времени в 12-часовом формате «hhmm aa» фактически даст вам время в 24-часовом формате, например, «17:00».

4 голосов
/ 16 августа 2011

правый. Решение состоит в том, чтобы явно установить языковой стандарт форматера даты, в идеале en_US_POSIX. См. Окончательный ответ на этот вопрос.

3 голосов
/ 26 июля 2012

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

Решение очень простое

Сначала я получаю локальную дату с устройства:

NSDate* now = [NSDate date];

Второй шаг - создать NSDateFormatter с языковым стандартом США независимо от языкового стандарта системы, чтобы убедиться, что «PM» будет «PM»:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];

Затем я получаю дату (год, месяц, день) в строку:

[formatter setDateFormat:@"yyyy-MM-dd"];
NSString *date = [formatter stringFromDate:now];

В следующей части я получу часы, минуты и секунды:

[formatter setDateFormat:@"hh"];
NSString *hours = [formatter stringFromDate:now];
[formatter setDateFormat:@"mm"];
NSString *minutes = [formatter stringFromDate:now];
[formatter setDateFormat:@"ss"];
NSString *seconds = [formatter stringFromDate:now];

Далее я получаю часть дня:

[formatter setDateFormat:@"a"];
NSString *partOfDay = [formatter stringFromDate:now];

Затем следует логика: если часть дня - вечера, но часы меньше 12, мы просто должны это исправить. В коде:

if([partOfDay isEqualToString:@"PM"] && [hours intValue] < 12) {
    hours = [[NSString alloc] initWithFormat:@"%i", ([hours intValue] + 12)];
}

После этой модификации мы готовы соединить строку, чтобы дата и время были готовы для сохранения в SQL:

NSString *sqlDateTime = [[NSString alloc] initWithFormat:@"%@ %@:%@:%@", date, hours, minutes, seconds];

Вот и все, что нужно сделать. И теперь мы можем только надеяться, что Apple собирается исправить эту ошибку, чтобы она работала так, как она должна быть.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...