NSDATEFORMATTER DATEFROMSTRING E IPHONE EM FORMATO DE 24 HORAS CONFUSÃO
-
24-09-2019 - |
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.
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.