NSDate et NSDateFormatter

Bonjour,


Je suis confronté à  un problème avec le formatage d'une date. En effet, je reçois une chaine avec une date du style "2013-08-14T17:51:08.39" (je sais, c'est bizarre mais c'est comme ça...)


 


J'aimerais donc convertir cette date dans un format plus sympa. Pour cela, j'utilise le code suivant:



NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@yyyy-MM-dd'T'HH:mm:ss.xx];
NSDate *date = [dateFormat dateFromString:dateString];
NSDateFormatter *miseEnForme = [[NSDateFormatter alloc] init];
[miseEnForme setDateFormat:@dd/MM/yyyy];
NSLog(@Date: %@", [miseEnForme stringFromDate:date]);

Le problème est que ça ne fonctionne pas: la variable date revoie null et le NSLog de la dernière ligne aussi... Je pense que c'est le format de la date que je donne ligne 2 qui n'est pas bon mais j'ai essayé y-M-d'T'H:m:S, y-M-d'T'H:m:s.xx, yyyy-M-d'T'HH:mm:S, ... sans succès... ???



Merci d'avance


Réponses

  • AliGatorAliGator Membre, Modérateur
    Ce format de date n'a rien de bizarre, c'est le format ISO 8601.

    Le format de date est assez classique pour ce standard, vu comment il est répandu (GIYF).

    1) Ton code ne marche pas parce que tu utilises ".xx" à  la fin, ne correspondant pas du tout à  ce que tu as en entrée. En effet, il suffit de lire la doc pour voir que la méthode setDateFormat: de NSDateFormatter mène tout droit à  la section "Date Formatter" du "Data Formatting Guide" qui indique quel standard est utilisé pour les formats, à  savoir le format standardisé du Unicode Technical Standard #35.

    Et quand tu regardes la signification de chacune des lettres à  utiliser pour indiquer un format de date, la lettre "x" (tout en bas du tableau) indique un décalage de fuseau horaire au format "+0800" par exemple pour un fuseau horaire GMT+8. Bref, rien à  voir avec les millisecondes que tu as à  la fin de ton horaire "17:51/08.39" dans ton exemple.
    Pour avoir les millisecondes, le tableau et le standard indiquent clairement qu'il faut utiliser la lettre "S" là  où tu as les millisecondes. A répéter autant de fois que tu as de chiffres indiquant les millisecondes. Et tout ça bien sûr en plus des autres lettres de format indiquant l'heure, les minutes et les secondes.

    Avec toutes ces infos et toutes ces docs, tu devrais trouver tout seul le bon format à  utiliser (je te laisse le trouver à  titre d'exercice).

    2) Sache que tu n'es pas obligé d'utiliser plusieurs instances de NSDateFormatter. D'autant qu'il se trouve que NSDateFormatter est une des classes (avec NSRegularExpression) qui met le plus de temps à  s'instancier (à  éviter à  tout prix de l'instancier dans une méthode appellée souvent du type "tableView:cellForRowAtIndexPath:" par exemple)

    3) Pour parser des dates venant d'internet (par opposition à  des date qui viendraient d'une saisie utilisateur, ou des dates que tu aurait à  afficher à  l'utilisateur), Il faut toujours utiliser la locale "en_US_POSIX", comme expliqué en détail dans ce Technical Q&A d'Apple
  • ça fonctionne merci beaucoup ! ;)


    En fait, j'avais trouvé le format standardisé du Unicode Technical Standard #35 et la lettre "S" mais j'avais compris que cette lettre correspondait aux secondes + millisecondes...


Connectez-vous ou Inscrivez-vous pour répondre.