NSDateFormatter dateFromString и iPhone в 24-часовом формате путаницы - PullRequest
25 голосов
/ 01 февраля 2010

У меня проблема. Я получаю входящие строки времени в 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, а theString - "3:19" - НЕПРАВИЛЬНО

В 12-часовом режиме дата - это 1970-01-01 15:19:00, а theString - это "3:19 PM" - ВПРАВО

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

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

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

Ответы [ 5 ]

29 голосов
/ 28 мая 2010

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

14 голосов
/ 12 сентября 2012

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

    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-часового формата

6 голосов
/ 28 января 2014

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

6 голосов
/ 01 февраля 2010

Я считаю, что @ "ч: мм а" должно быть @ "ЧЧ: мм а".

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

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

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

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

1 голос
/ 01 февраля 2010

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

Спасибо. Я обернулся с этим кодом:

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]; 

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

...