Сравнение iOS NSDate работает по-разному, когда 24-часовое время в настройках даты переключается между ON и OFF?

Команда, я сравниваю дату, сформированную из строки с помощью NSDateFormatter, с системной датой iOS. Приведенный ниже оператор возвращает значение true, если для системных настроек даты и времени установлено значение 24-часовой формат, но тот же код возвращает значение false, если 24-часовой формат выключен.

Проблемный код:

if ([(NSDate*)[NSDate date] compare:currDate] == NSOrderedAscending) {
     // -- Code -- This is executed only when the 4-Hour Time ON
 }

Я смущен. Строка, с помощью которой я получаю дату, имеет формат 24 часа. Это проблема? Или что-то еще?

Код форматирования даты:

-(NSDate *)getDateFromString:(NSString *)dateString{
    NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
    [fmt setDateFormat:@"dd MMM yyyy hh:mm:ss"];
    [fmt setTimeZone:[NSTimeZone systemTimeZone]];
    [fmt setFormatterBehavior:NSDateFormatterBehaviorDefault];  
    return [fmt dateFromString:dateString];
}

person Easwaramoorthy K    schedule 23.05.2013    source источник
comment
Вы можете проверить формат времени и выполнить?   -  person Buntylm    schedule 23.05.2013
comment
Откуда dateString? Покажите нам пример его значения, когда устройство iOS находится в 24-часовом режиме и когда устройство iOS находится в 12-часовом режиме.   -  person rmaddy    schedule 23.05.2013
comment
Примечания: 1) Почему вы используете [NSDate date]? Это уже NSDate *. 2) Нет необходимости устанавливать часовой пояс форматирования даты. Он уже по умолчанию соответствует текущему часовому поясу. 3) Нет необходимости устанавливать поведение форматера. По умолчанию используется BehaviorDefault.   -  person rmaddy    schedule 23.05.2013
comment
@rmaddy Это образец строки даты 23 мая 2013 г., 15:37:00. Это из сервиса.   -  person Easwaramoorthy K    schedule 23.05.2013
comment
Лишь бы исключить. В форматтере можно поменять чч на чч?   -  person Vertig0    schedule 23.05.2013


Ответы (2)


См. Технические вопросы и ответы 1480.

Вам необходимо установить локаль средства форматирования даты на специальную локаль en_US_POSIX. Также необходимо указать 24-часовой формат — HH, а не hh.

-(NSDate *)getDateFromString:(NSString *)dateString{
    NSLocale *posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
    [fmt setLocale:posix];
    [fmt setDateFormat:@"dd MMM yyyy HH:mm:ss"];

    return [fmt dateFromString:dateString];
}
person rmaddy    schedule 23.05.2013
comment
Спасибо за ваше предложение HH работает для меня ... Но почему я хочу добавить материалы NSLocale? Даже без этого работает. Не могли бы вы объяснить, когда он сломается, если мы не добавим NSLocale? - person Easwaramoorthy K; 23.05.2013
comment
@EaswaramoorthyKanagaraj: Он предоставил ссылку на документ Apple, что объясняет почему. Прочитайте это, и вы поймете, почему вам нужно изменить локаль. - person lnafziger; 23.05.2013

23 May 2013 15:37:00 – это строка в 24-часовом формате. Таким образом, правильная дата получается с помощью средства форматирования даты в 24-часовом формате. Вот и все.

Так что используйте

[fmt setDateFormat:@"dd MMM yyyy HH:mm:ss"];
person Lithu T.V    schedule 23.05.2013
comment
Это больше, чем это. См. Технические вопросы и ответы 1480. - person rmaddy; 23.05.2013
comment
Это работает для меня! Спасибо, так как ответ @rmaddy содержит больше информации, принимая его ответ! - person Easwaramoorthy K; 23.05.2013