2015-09-19 10 views
8

Una delle mie app ha un problema dopo l'esecuzione su un dispositivo che è appena aggiornato a iOS9 (l'obiettivo dell'app è 8.1).NSDateFormatter.dateFromString restituisce null dopo l'aggiornamento iOS9

L'app sta funzionando bene su pre iOS9, tuttavia, dopo aver aggiornato SOLO su iOS9 sul dispositivo, si sta verificando il seguente problema.

La variabile di seguito denominata "anObsDate" restituisce ora null. Non ho idea del perché. Sembra che l'aggiornamento autonomo di iOS9 sul dispositivo host abbia attivato questo problema.

NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Quando eseguo l'applicazione con il seguente di debug, abbiamo questa uscita:

 NSLog(@"Timestamp %@", [anObs timeStamp]); 
    NSLog(@"Formatter %@", [self bomDateFormatter]); 
    NSDate *anObsDate = [[self bomDateFormatter] dateFromString:[anObs timeStamp]]; 

Timestamp 2015-09-17 00:01:10 
Formatter <NSDateFormatter: 0x7fe7abc653c0> 

ho impostato la mia data formattatore come segue:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]; 
NSDateFormatter *countDownFormatter = [[NSDateFormatter alloc] init]; 
[countDownFormatter setLocale:locale]; 
[countDownFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Melbourne"]]; 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss"]; 
return countDownFormatter; 

di nuovo a fare questa chiara , se eseguo la mia app su un dispositivo pre iOS9, tutto funziona correttamente e dateFromString restituisce un NSDate. Dopo l'aggiornamento a iOS9 dateFromString restituisce null.

Qualche suggerimento?

Grazie.

risposta

6

Sembra che NSDateFormatter sia cambiato in comportamento in iOS 9 in modo che i singoli caratteri tra virgolette nel formato data debbano corrispondere esattamente ai caratteri nella stringa. In precedenza accettava qualsiasi carattere (cercava i documenti, ma non riusciva a trovare alcuna menzione di questo cambiamento).

Nella stringa data/ora manca la "T" definita nel formato data. Provare a cambiare il formato della data a:

// Note the "T" has been removed 
[countDownFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss"]; 

L'altra opzione sarebbe quella di aggiungere la "T" nella stringa di timestamp:

// Note the "T" has been added 
2015-09-17T00:01:10 

questo dovrebbe essere compatibile con le versioni precedenti di iOS.

+0

Spot on. Ho rimosso la "T" dal mio formato data e ho risolto il problema. Tuttavia, non avrei dovuto aspettarmi di aver bisogno di farlo con un aggiornamento iOS standalone. – ack

+0

concordato. Probabilmente meritevole di una segnalazione di bug ad Apple. – ospr

+2

Apple mi ha ricordato che le impostazioni locali come "en_AU" sono costrutti rivolti all'utente e che * cambiano regolarmente *. Ad esempio, intorno al 1966, l'en_AU è cambiato dal lavorare con "£" a lavorare con "$". Le stringhe del formato della data non garantiscono la stabilità in una locale rivolta all'utente. Raccomandano l'uso di en_US_POSIX, che dovrebbe essere un locale fisso che non cambia mai. Tuttavia, il problema che ho riportato sopra esiste ancora con en_US_POSIX ... Il fatto che un NSDate valido è stato restituito quando il formatter di stringa e la stringa non corrispondono è di per sé un bug; che sembra essere stato corretto su iOS9. – ack

3

Questo è risolto il mio problema. Puoi anche usarlo.

In Objective C:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 

In Swift:

let dateFormatter = NSDateFormatter()  
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
Problemi correlati