2015-03-31 11 views
10

Sono bloccato per ora. Ho usato felicemente NSDateFormatter senza problemi, ma oggi ho notato che una delle mie app mi sta dando risultati pazzeschi su un dispositivo iPhone 6 plus con iOS 8.1.3 - mentre sembra che vada bene su altri dispositivi/simulatore. Guardando in esso v'è di questo codice:NSDateFormatter "HH" restituisce am/pm su dispositivo iOS 8

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[dateFormatter setDateFormat:@"HH"]; 
NSInteger hour= [[dateFormatter stringFromDate:datetime] integerValue]; 

Questo risultati (sul dispositivo) per 0-12 ore di notazione, perché per una ragione che è al di là di me, se stampo [dateFormatter stringFromDate: datetime] a quel punto Ottengo "4 pm"!

Cosa mi manca?

+0

cosa succede se si rimuove [dateFormatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @ "UTC"]]; e provato a ottenere il valore dell'ora? –

+0

Ok, ho studiato di più. Quella linea non lo influenza. Il problema è quando hai selezionato una regione come il Regno Unito o la Francia che per impostazione predefinita è il formato 24 ore ma disabiliti "24 ore al giorno" nelle impostazioni e quindi non imposta le impostazioni internazionali per dataFormatter. Semplice, eh? Scegli Regno Unito, disabilita l'intervallo di 24 ore, interruzioni "HH". Bello. – Ecuador

+0

Hai ragione, è un problema noto che non avevo trovato nella mia ricerca. Apple non vuole ripararlo neanche ... – Ecuador

risposta

16

Modificato: Per visualizzare il problema, nelle impostazioni del telefono selezionare una regione per impostazione predefinita su 24 ore, ad esempio "Regno Unito" o "Francia". Quindi, disabilitare "24 ore" dalle impostazioni. Ora se si crea un NSDateFormatter senza impostarne le impostazioni internazionali, "HH" non funzionerà. Per aggirare questo problema, imposta le impostazioni internazionali (anche sullo stesso telefono in quel momento), ad es. per il codice precedente potremmo aggiungere:

dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

Qualsiasi locale funzionerà, anche en_GB. Questo è ovviamente un bug, e non una sorta di strana rappresentazione dello standard Unicode, perché se hai impostato una regione che ha un valore predefinito di 12 ore, il cursore "24 ore" non influenza il modo in cui "HH" funziona, mentre se ci si trova in una regione che ha una durata di 24 ore, quindi il cursore nelle impostazioni influirà sul funzionamento del codice.

+1

salva vita! Grazie! – Mona

Problemi correlati