NSDateFormatter renvoie zéro dans swift et iOS SDK 8.0

Je suis en train de lire le tutoriel fourni par Raywenderlich, Chapitre 29 Quoi de neuf avec les tests , et de rencontrer un problème étrange.

Voici le code du tutoriel qui convertit une string en date:

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

La dateSsortingng est du formulaire

 2014-06-21 14:56:00 EST 

Cependant, la variable date est toujours nulle.

NOTE: lors de la lecture de ce code dans la cour de récréation, cela fonctionne correctement, comme le montre l'image:

entrez la description de l'image ici

Je travaille dans iOS SDK 8.0. Est-ce un bug du SDK?


Actualisé

Je teste en utilisant un dernier iPod Touch avec iOS 8.

Lorsque vous définissez une string dateFormat vous devez également définir la propriété locale sur quelque chose compatible avec le format fourni. Sinon, les parameters régionaux seront basés sur les parameters de l'appareil qui peuvent ne pas être compatibles.

Le format de date que vous avez fourni ici fonctionnera avec les parameters régionaux "en" mais il ne fonctionnera pas avec beaucoup d'autres, comme "eu". Voici un exemple:

 let dateSsortingng = "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.dateFromSsortingng(dateSsortingng) 

Le problème ici est "EST" qui n'existe que dans l'Amérique du Nord. Dans tous les autres parameters régionaux, il s'agit d'un timezone invalide. Si vous modifiez votre string de date à ceci:

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

Ensuite, la date sera correctement formatée, quelle que soit la valeur définie pour les locale .

Les comportements de NSDateFormatter dépendent fortement de ses locale . Par défaut, il utilise les parameters régionaux de l'appareil. Si vous voulez get un résultat cohérent, vous devez spécifier manuellement les locale . Dans la plupart des cas, en_US_POSIX est le meilleur.

Le document dit:

Si vous travaillez avec des dates au format fixe, vous devez d'abord définir les parameters régionaux du formateur de date sur quelque chose de approprié pour votre format fixe. Dans la plupart des cas, le meilleur paramètre régional à utiliser est en_US_POSIX, un environnement local spécialement conçu pour générer des résultats en anglais américain, indépendamment des preferences user et système. fr_US_POSIX est également invariant dans le time (si les Etats-Unis, à un moment donné, modifient la façon dont il formate les dates, en_US changera pour refléter le nouveau comportement, mais pas en_US_POSIX), et entre les plateforms (en_US_POSIX fonctionne de la même manière sur iPhone OS comme sur OS X, comme sur d'autres plateforms).

Comme ça:

 let dateSsortingng = "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.dateFromSsortingng(dateSsortingng)