Pergunta

Estou tendo um problema. Recebo as cordas de tempo em formato de 12 horas e as transformo em objetos nsdate. Quando o iPhone está em formato de 12 horas, não há problema. Mas quando está em formato 24 horas, as coisas dão errado. Aqui está algum código de exemplo para demonstrar:

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

No modo 24 horas, encontro é 1970-01-01 03:19:00 e a corda é "3:19" - errado

No modo de 12 horas, encontro é 1970-01-01 15:19:00 e a corda é "15:19 pm" - certo

Então ... Pergunta 1: Por que a configuração de 24 horas do dispositivo está substituindo minha configuração de formatador de data?

E, mais importante, a pergunta 2: como faço para obter uma conversão adequada de 12 horas para 24 horas?

Eu já tenho código para detectar se o telefone está no modo 24 horas, mas, além de cavar na corda e trocar os 3 com um 15, não parece haver uma maneira limpa de fazer isso.

Foi útil?

Solução

Não tenho certeza se você ainda precisa, mas tive um problema semelhante que foi resolvido definindo a localidade para o formatador da data. Ou seja, se você deseja forçá-lo ao modo de 12 horas, independentemente da configuração do modo de 24 horas por 24/12 horas do usuário, defina a localidade como en_us_posix.

Outras dicas

O motivo desse comportamento é o local, defina o local correto

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

Funciona para formato de 24 horas e 12 horas

Eu acredito que o @"h: mm a" deve ser @"hh: mm a".

Se você usar o DateFormatter pré-construção no cacau, tudo será resolvido para você.

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

NSDateFormatterShortStyle e NSDateFormatterNoStyle Vem em diferentes variedades. Usando, garantirá que você respeite as configurações que o usuário selecionou para datas e horários.

A conversão de 12 a 14 horas de relógio é resolvida pelo SDK, se você tiver um modelo ou algum objeto de valor para armazenar suas datas, tente mantê-las como NSDate. Dessa forma, você pode formatá -los apenas quando precisar exibi -los. Salvar as datas como strings pode abrir um mundo de problemas quando você talvez as analisasse do XML, onde o GMT é especificado separadamente ou tenta adicionar e subtrair NSTimeIntervals.

Eu mudei de @"hh: mm: ss" para @"Hh: mm: ss" E o estilo de tempo foi alterado de "13:03" para "13:03". Espero que isso o ajude.

Ok, deixei um comentário, mas ele esmagou todo o código, então terei que "responder" minha pergunta com um comentário:

Obrigado. Eu dei um giro com este código:

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

E a data surge nil. Eu encontrei isso mais cedo, quando tentei essa rota, e não está funcionando. Muito frustrante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top