Pergunta

Eu estou tentando imprimir a data em um determinado formato:

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

Se o iPhone está definido para tempo de 24 horas, isso funciona bem, se por outro lado que o usuário defina-o como tempo de 24 horas, em seguida, volta para AM / PM (ele funciona muito bem até que você alternar essa configuração), então ele acrescenta o AM / PM no final, embora eu não pedi-lo:

20080927030337 PM

estou fazendo de errado alguma coisa ou isso é um bug com firmware 2.1?

Editar 1: descrição feita mais clara

Editar 2 solução alternativa: Acontece que este é um erro, corrigi-lo eu definir o AM e personagens PM para "":

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];
Foi útil?

Solução

Usando o código que você postou, tanto no simulador e um telefone com o firmware 2.1 e 24 horas horário definido para fora, eu nunca teve um AM / PM anexado ao dateStr quando eu faço:

NSLog(@"%@", dateStr);

Você está fazendo qualquer outra coisa com dateStr que você não postar aqui? Como você está verificando o valor?

Acompanhamento

Tente ligar a definição am / pm em seguida, desligado. Eu não tive o problema, quer, até que eu fiz isso. Estou imprimi-lo da mesma maneira que você é.

Ok, eu vejo isso quando eu faço isso também. Tem que ser um bug. Eu recomendo que você um relatório de bug e apenas verificar e filtrar os caracteres indesejados no mesmo período.

Outras dicas

A razão para este comportamento é Locale, ele define o local correto.

Defina o local do seu NSDateFormatter para en_US_POSIX irá corrigir isso. Ele funciona tanto para formato de 24 horas e 12 horas.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set. De maçã doc

Tente este,

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

Aqui está a explicação do erro iPhone SDK (também ainda está lá em 3.1 beta SDK)

Primeiro, um pouco de fundo sobre a interface de usuário do iPhone. quando o iPhone usuários mudar seu formato região entre, digamos, “Estados Unidos” e “França”, a definição dos usuários ‘24 horas Time’ é automaticamente comutada para o modo que é mais prevalente nessa região. Na França, que iria definir 24 horas Tempo para “ON”, e nos EUA, que configurá-lo para "FORA". Os usuários podem, em seguida, substituir manualmente essa configuração e isso é onde começa problemas.

O problema vem de NSDateFormatter de alguma forma “ficar preso” na Modo de tempo de 12 ou 24 horas que o utilizador tenha seleccionado manualmente. Portanto, se um utilizador francês selecciona manualmente o modo de 12 horas, e a aplicação solicitado NSDateFormatter ao tempo de saída com o formato de 24 horas “Hhmm”, seria realmente receber vez em um formato de 12 horas, por exemplo, “01:00 PM”, como se o pedido tinha em vez solicitado “aa hhmm”. O reverso que aconteceria se um utilizador US seleccionada manualmente o modo de 24 horas: tempo de saída com o formato de 12 horas “aa hhmm” seria realmente chegar Você hora no formato de 24 horas em vez disso, por exemplo, “17:00".

Mais detalhes e uma possível solução pode ser encontrada nesta blogue .

A definição de localidade na data formatador para en_US corrige o problema para mim:

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

Eu não tenho certeza se a adição do calendário também é necessário, mas isso funciona bem.

Eu acho que esta é a solução.

NSDateFormatter *df =[[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[df setLocale: usLocale];

[usLocale release];

 NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease];

documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"];

[df release];

        NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea);


//ouput  
     fdocumentoenLineaUTC:2010-07-16 09:40:33 p.m. -0500!

Para aqueles encontrar esta pergunta que querem usar NSDateFormatter para analisar tempo de 24 horas e estão batendo este erro, usando NSDateComponents a datas de análise e os tempos que têm um formato conhecido evita esse problema:

NSString *dateStr = @"2010-07-05";
NSString *timeStr = @"13:30";

NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = [[dateStr substringToIndex:4] intValue];
components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue];
components.day = [[dateStr substringFromIndex:8] intValue];
components.hour = [[timeStr substringToIndex:2] intValue];
components.minute = [[timeStr substringFromIndex:3] intValue];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [calendar dateFromComponents:components];

[components release];
[calendar release];

Isso também deve funcionar (eu estou vendo alguns resultados bizarros embora).

-(NSString*)lowLevTime:(NSString*)stringFormat {
    char buffer[50];
    const char *format = [stringFormat UTF8String];
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(buffer, sizeof(buffer), format, timeinfo);
    return [NSString  stringWithCString:buffer encoding:NSASCIIStringEncoding];
}

resposta curta: tentativa [dateFormatter setDateFormat:@"yyyyMMddhhmmss"]; para formato de 12 horas (note a hh minúsculas).

Tem sido um tema frustrante porque tantos sites indicam a utilização HH por horas (incluindo a documentação oficial da Apple), mas o formato que os conjuntos lo a 24 horas, enquanto que hh usa o formato de 12 horas. Consulte http://unicode.org/reports/tr35/tr35-6.html# Date_Format_Patterns para mais detalhes.

Como um bônus, nota que você também pode usar KK ou kk para hora do formato de dia, o que provavelmente vai estar fora por um.

Update: Recentemente eu estava olhando para NSLocale (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) e parece que você pode usar para autoupdatingCurrentLocale aplicar as alterações feitas a partir de dentro do aplicativo para a localidade. O resultado disso é que, mesmo se o telefone está configurado para usar um relógio de 24 horas (como quando você mudou para a França), você pode fazer uma alternância 12/24 para o aplicativo que não terá impacto sobre quaisquer outros aplicativos no telefone, ou exigir-lhe para deixar o aplicativo para fazer a mudança.

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