2014-10-02 12 views
7

Sto leggendo il tutorial fornito da Raywenderlich, Chapter 29 What’s New with Testing, e si imbattono in uno strano problema.NSDateFormatter restituisce nil in swift e iOS SDK 8.0

seguito è il codice nel tutorial conversione di una stringa in data:

// Convert date string to date. 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz" 
var date: NSDate? = dateFormatter.dateFromString(dateString) 

La dateString è della forma

2014-06-21 14:56:00 EST 

Tuttavia, la variabile data è sempre nulla.

NOTA: quando si gioca questo codice nel parco giochi, funziona correttamente, come l'immagine mostra:

enter image description here

sto lavorando in iOS SDK 8.0. È un bug dell'SDK?


Aggiornato

sto testando con un ultimo iPod Touch con iOS 8.

+1

È questo su un dispositivo o sul simulatore? Potresti essere un po 'per "funzionalità locale". –

+0

@HotLicks, in esecuzione su un dispositivo installato iOS 8 – HanXu

+0

Bummer. Funziona per me in un parco giochi, simulatore e iPhone 5s con iOS 7.1 –

risposta

11

Quando si imposta una stringa dateFormat è necessario anche impostare la proprietà locale a qualcosa che è compatibile con il formato previsto . In caso contrario, la locale sarà basata sulle impostazioni del dispositivo che potrebbero non essere compatibili.

Il formato della data che hai fornito qui funzionerà con la locale "en" ma non funzionerà con molti altri, come "eu". Ecco un esempio:

let dateString = "2014-06-21 14:56:00 EST" 

let localeStr = "eu" // this will give nil 
let localeStr = "us" // this will succeed 

let dateFormatter = NSDateFormatter() 
dateFormatter.locale = NSLocale(localeIdentifier: localeStr) 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz" 
var date: NSDate? = dateFormatter.dateFromString(dateString) 

Il problema qui è "EST", che esiste solo nel Nord America. In tutti gli altri locali è un fuso orario non valido. Se si cambia la stringa di data in questo:

"2014-06-21 14:56:00 UTC-5" 

Poi è la data sarà formattare correttamente, non importa quale valore locale viene impostato.

+0

Ho visto le tue modifiche negli ultimi due minuti e tu sei per lo più corretto su "EST". I fusi orari non sono affatto standardizzati, il che li rende molto fastidiosi con cui lavorare. Qui in Australia in realtà vedo AEST piuttosto che EST la maggior parte del tempo, ma i documenti Apple non sono d'accordo. Secondo loro, "EST" è un fuso orario valido in Australia e negli Stati Uniti: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html – ttarik

+0

@ ev0lution yes ma by il mio test "EST" dà zero se il locale è 'en_AU' mentre" AEST "funziona con le impostazioni locali australiane. L'ho capito dopo la pubblicazione, quindi ho modificato le mie modifiche alcune volte e alla fine l'ho rimosso. –

+0

È interessante notare che ... se la locale è "au", allora "EST" funziona. Suppongo che ci sia probabilmente una ragione per questo. Per lo stesso motivo sebbene EST con identificatore "au" dia lo stesso tempo (5:56) di EST sotto "noi", quindi penso che ci sia un bug da qualche parte. È preferibile attenersi alle corrette correzioni del fuso orario (UTC-5) se possibile. –

5

NSDateFormatter I comportamenti dipendono fortemente dal numero di telefono locale. Per impostazione predefinita, utilizza le impostazioni locali del dispositivo. Se si desidera ottenere risultati coerenti, è necessario specificare manualmente locale. Nella maggior parte dei casi, en_US_POSIX è il migliore.

The document dice:

Se si lavora con date in formato fisso, si deve prima impostare l'impostazione della data di formattatore a qualcosa di appropriato per il formato fisso. Nella maggior parte dei casi, la migliore impostazione internazionale da scegliere è en_US_POSIX, una lingua specificatamente progettata per fornire risultati in inglese americano, indipendentemente dalle preferenze dell'utente e di sistema. en_US_POSIX è anche invariato nel tempo (se gli Stati Uniti, ad un certo punto nel futuro, cambiano il modo in cui formatta le date, en_US cambierà per riflettere il nuovo comportamento, ma en_US_POSIX non lo farà), e tra le piattaforme (en_US_POSIX funziona lo stesso su iPhone OS come su OS X e come su altre piattaforme).

Ti piace questa:

let dateString = "2014-06-21 14:56:00 EST" 

let dateFormatter = NSDateFormatter() 
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz" 
var date: NSDate? = dateFormatter.dateFromString(dateString) 
Problemi correlati