Domanda

Sto cercando di stampare la data in un determinato formato:

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

Se l'iPhone è impostato su 24 ore, funziona perfettamente, se invece l'utente lo ha impostato su 24 ore, quindi torna su AM / PM (funziona bene fino a quando non si attiva questa impostazione) accoda l'AM / PM alla fine anche se non l'ho chiesto:

20080927030337 PM

Sto facendo qualcosa di sbagliato o è un bug con il firmware 2.1?

Modifica 1: resa più chiara la descrizione

Modifica della soluzione alternativa 2: risulta che si tratta di un bug, per risolverlo ho impostato i caratteri AM e PM su " " ;:

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];
È stato utile?

Soluzione

Usando il codice che hai pubblicato sia sul simulatore che su un telefono con il firmware 2.1 e l'ora 24 ore su off, non ho mai avuto un AM / PM aggiunto a dateStr quando lo faccio:

NSLog(@"%@", dateStr);

Stai facendo qualcos'altro con dateStr che non hai pubblicato qui? Come stai controllando il valore?

Seguito

  

Prova ad attivare e disattivare l'impostazione am / pm. Neanche io ho avuto il problema, fino a quando non l'ho fatto. Lo sto stampando nello stesso modo in cui sei.

Va ??bene, lo vedo anche quando faccio questo. Deve essere un bug. Ti consiglio di presentare una segnalazione di bug e nel frattempo controllare e filtrare i caratteri indesiderati.

Altri suggerimenti

Il motivo di questo comportamento è Locale, Imposta la Locale corretta.

Imposta il locale del tuo NSDateFormatter su en_US_POSIX risolverà questo problema. Funziona sia in formato 24 ore che 12 ore.

Su iPhone OS, l'utente può ignorare l'impostazione predefinita AM / PM rispetto a 24 ore (tramite Impostazioni > Generale > Data & amp; Ora > Ora 24 ore), che provoca la riscrittura di NSDateFormatter la stringa di formato impostata. Da apple doc

Prova questo

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

Ecco la spiegazione del bug dell'SDK dell'iPhone (presente anche nell'SDK 3.1 beta)

  

Innanzitutto, un po 'di sfondo sull'interfaccia utente di iPhone. Quando iPhone   gli utenti cambiano il formato della regione tra, per esempio, "Stati Uniti" e   "Francia", l'impostazione "Ora 24 ore" degli utenti viene commutata automaticamente   alla modalità più diffusa in quella regione. In Francia, quello   imposterà il tempo di 24 ore su "ON", e negli Stati Uniti lo imposterà su   “OFF”. Gli utenti possono quindi sostituire manualmente quell'impostazione e quella   dove iniziano i problemi.

     

Il problema deriva da NSDateFormatter in qualche modo "rimanere bloccati" in   Modalità temporale di 12 o 24 ore che l'utente ha selezionato manualmente. Quindi se a   L'utente francese seleziona manualmente la modalità 12 ore e l'applicazione   ha richiesto NSDateFormatter per generare l'ora con il formato 24 ore   "HHmm", riceverebbe effettivamente il tempo in un formato di 12 ore, ad es.   "01:00 PM", come se l'applicazione avesse invece richiesto "hhmm aa".   Il contrario accadrebbe se un utente americano selezionasse manualmente la modalità 24 ore:   il tempo di uscita con il formato di 12 ore "hhmm aa" sarebbe effettivamente ottenere   invece cronometri nel formato di 24 ore, ad es. “17:00".

Ulteriori dettagli e una possibile soluzione alternativa sono disponibili in questo blog .

L'impostazione delle impostazioni internazionali in data formatter su en_US risolve il problema per me:

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

Non sono sicuro se sia necessario aggiungere anche il calendario, ma questo funziona bene.

Penso che questa sia la soluzione.

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!

Per coloro che trovano questa domanda che desiderano utilizzare NSDateFormatter per analizzare il tempo di 24 ore e stanno riscontrando questo errore, l'utilizzo di NSDateComponents per analizzare le date e gli orari che hanno un formato noto elimina questo 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];

Anche questo dovrebbe funzionare (sto vedendo alcuni risultati bizzare però).

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

Risposta breve: prova [dateFormatter setDateFormat: @ " yyyyMMddhhmmss "]; per il formato 12 ore (nota il hh minuscolo).

È stato un argomento frustrante perché molti siti web indicano di utilizzare HH per ore (inclusa la documentazione ufficiale di Apple), ma che lo imposta nel formato 24 ore, mentre hh utilizza il formato 12 ore. Vedi http://unicode.org/reports/tr35/tr35-6.html# Date_Format_Patterns per maggiori dettagli.

Come bonus, nota che puoi anche usare KK o kk per il formato dell'ora del giorno, che probabilmente sarà disattivato di uno.

Aggiornamento: Di recente stavo guardando NSLocale (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) e sembrerebbe che tu possa usare autoupdatingCurrentLocale per applica le modifiche apportate dall'app alla locale. Il risultato di questo è che anche se il telefono è impostato per utilizzare un orologio 24 ore (come quando sei passato alla Francia), puoi fare un interruttore 12/24 per l'app che non avrà alcun impatto su altre app sul telefono, o ti richiede di lasciare l'app per apportare la modifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top