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, кажется, нет чистого способа сделать это.
Ответы
Ответ 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];
И дата приходит ноль. Я столкнулся с этим раньше, когда пробовал этот маршрут, и он не работает. Очень расстраивает.