Подтвердить что ты не робот

NSDateFormatter dateFromString и iPhone в 24-часовом формате Confusion

У меня проблема. Я получаю входящие строки времени в 12-часовом формате, и я превращаю их в объекты NSDate. Когда iPhone находится в 12-часовом формате, проблем нет. Но когда он в формате 24 часа, все идет не так. Вот пример кода для демонстрации:

NSString *theTime = @"3:19 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"h:mm a"]; // "3:19 PM"
NSDate *date = [formatter dateFromString:theTime];
NSString *theString = [formatter stringFromDate:date];

В режиме 24 часа дата - 1970-01-01 03:19:00, а строка - "3:19" - WRONG

В 12-часовом режиме дата - 1970-01-01 15:19:00, а строка - "3:19 PM" - RIGHT

Итак... вопрос 1: почему настройка 24 часа в устройстве отменяет настройку форматирования даты?

и, что более важно, вопрос 2: Как мне получить правильное преобразование с 12-часового времени до 24-часового времени?

У меня уже есть код для определения того, находится ли телефон в 24-часовом режиме, но кроме копания в строке и замены 3 с помощью 15, кажется, нет чистого способа сделать это.

4b9b3361

Ответ 1

Не уверен, что вам все еще нужно, но у меня была аналогичная проблема, которая была решена путем установки языкового стандарта для форматирования даты. То есть, если вы хотите принудительно настроить его на 12-часовой режим, независимо от пользовательского режима 24/12 часов, вы должны установить локаль в en_US_POSIX.

Ответ 2

Причиной такого поведения является Locale, установите правильный Locale

    NSString *strAgendaDate = @"01/17/2012 12:00 AM";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

    [dateFormatter setDateFormat:AgendaDateFormatForMeeting];
    NSDate *meetingDate = [dateFormatter dateFromString:aStrDate];
    [dateFormatter setDateFormat:AgendaDateRepresentation];
    strAgendaDate = [dateFormatter stringFromDate:meetingDate];

Он работает как для 24-часового, так и для 12-часового формата

Ответ 3

Я считаю, что @ "h: mm a" должно быть @ "HH: mm a".

Если вы используете форматирование даты до сборки в cocoa, все будет заботиться о вас.

NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
[timeFormatter setDateStyle:NSDateFormatterNoStyle];

NSDateFormatterShortStyle и NSDateFormatterNoStyle происходит в разных вариантах. С их помощью вы будете следить за настройками, которые пользователь выбрал для дат и времени.

12-14-часовое преобразование часов выполняется SDK, если у вас есть модель или какой-то объект значения для хранения ваших дат, попробуйте сохранить их как NSDate. Таким образом, вы можете отформатировать их только тогда, когда вам нужно их отобразить. Сохранение дат в виде строк может открыть мир неприятностей, когда вы, возможно, проанализируете их из xml, где GMT ​​задается отдельно или пытается добавить и вычесть NSTimeIntervals.

Ответ 4

Я изменился с @ "hh: mm: ss" на @ "HH: mm: ss" , а стиль времени был изменен с " 1:03 PM" до " 13:03". Надеюсь, это поможет вам.

Ответ 5

Хорошо, я оставил комментарий, но он скрепил весь код вместе, поэтому мне придется "ответить" на мой вопрос с комментариями:

Спасибо. Я дал ему вихрь с этим кодом:

NSString *theTime = @"3:19 PM"; 
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease];       
[timeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
[timeFormatter setDateStyle:NSDateFormatterNoStyle]; 
NSDate *date = [timeFormatter dateFromString:theTime]; 
NSString *theString = [timeFormatter stringFromDate:date]; 

И дата приходит ноль. Я столкнулся с этим раньше, когда пробовал этот маршрут, и он не работает. Очень расстраивает.