NSdate d/M/Y to Y-M-d

Bonjour à  tous,


 


J'aimerais élucidé un mystère:



NSString * Startdate = @1981-02-10;
NSLog(@%@",Startdate);//1981-02-10
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@Y-M-d];
NSDate *dte = [dateFormat dateFromString:Startdate];
NSLog(@%@",dte);//1981-02-09 23:00:00 +0000
NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
[dateFormat1 setDateFormat:@d/M/Y];
NSString *dating = [dateFormat1 stringFromDate:dte];
NSLog(@%@",dating);// OK 10/2/1981
//L'AUTRE SENS MAINTENANT
NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];
[dateFormat2 setDateFormat:@d/M/Y];
NSDate *dte2 = [dateFormat2 dateFromString:dating];
NSLog(@%@",dte2);//1980-12-21 23:00:00 +0000
NSDateFormatter *dateFormat3 = [[NSDateFormatter alloc] init];
[dateFormat3 setDateFormat:@Y-M-d];
NSString *dating2 = [dateFormat3 stringFromDate:dte2];
NSLog(@%@",dating2);//1980-12-22


Mon code fonctionne très bien dans un premier temps de Y-M-d vers d/M/Y mais pas dans l'autre sens?


Quelqu'un pourrait m'éclairer?


 


Bien à  vous.


 


Réponses

  • denis_13denis_13 Membre
    septembre 2014 modifié #2

    bonjour,


    il me semble que les formats de dates ne sont pas bons (ils ont changé de conventions il y a quelques années) essayes avec: @yyyy-M-dd et @dd/M/yyyy 


     


    Denis


  • AliGatorAliGator Membre, Modérateur

    Je t'invite à  lire Le Date Formatting Programming Guide.


     


    1) Utiliser setDateFormat et fournir un format en dur n'est en général pas conseillé, sauf si tu fais du parsing de dates venant d'un JSON. Mais pas pour l'affichage, car pour l'affichage il faut plutôt utiliser les formats de date qui correspondent à  ceux qu'a choisi l'utilisateur dans ses préférences personnelles de son iPhone ou iPad, plutôt que lui imposer un format qui ne collera pas avec ce qu'il a choisi dans ses prefs.


     


    2) La syntaxe des formats supportés quand tu utilises setDateFormat sont décrit dans la norme Unicode UTS#35-tr19 comme l'indique le lien dans le Programming Guide précédemment cité. Et en effet vu que les jours et mois de ta date sont sur plus d'un chiffre, c'est compréhensible qu'avec le format que tu as mis le parsing échoue, vu que tu lui as demandé vu le format choisi de n'accepter qu'un chiffre.


     


     


    PS : Je t'invite aussi fortement à  te forcer à  respecter les conventions de nommage. Entre autres, ton StartDate avec une majuscule me fait extrêmement mal aux yeux.


  • Merci denis !


     


    Voici le code correct:



    NSString * startdate = @1981-02-10;
    NSLog(@%@",startdate);
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@yyyy-M-dd];
    NSDate *dte = [dateFormat dateFromString:Startdate];
    NSLog(@%@",dte);
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
    [dateFormat1 setDateFormat:@dd/M/yyyy];
    NSString *dating = [dateFormat1 stringFromDate:dte];
    NSLog(@%@",dating);
    NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];
    [dateFormat2 setDateFormat:@dd/M/yyyy];
    NSDate *dte2 = [dateFormat2 dateFromString:dating];
    NSLog(@%@",dte2);
    NSDateFormatter *dateFormat3 = [[NSDateFormatter alloc] init];
    [dateFormat3 setDateFormat:@yyyy-M-dd];
    NSString *dating2 = [dateFormat3 stringFromDate:dte2];
    NSLog(@%@",dating2);


  •  


    Merci denis !


     


    Voici le code correct:



    NSString * startdate = @1981-02-10;
    NSLog(@%@",startdate);
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@yyyy-M-dd];
    NSDate *dte = [dateFormat dateFromString:Startdate];
    NSLog(@%@",dte);
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
    [dateFormat1 setDateFormat:@dd/M/yyyy];
    NSString *dating = [dateFormat1 stringFromDate:dte];
    NSLog(@%@",dating);
    NSDateFormatter *dateFormat2 = [[NSDateFormatter alloc] init];
    [dateFormat2 setDateFormat:@dd/M/yyyy];
    NSDate *dte2 = [dateFormat2 dateFromString:dating];
    NSLog(@%@",dte2);
    NSDateFormatter *dateFormat3 = [[NSDateFormatter alloc] init];
    [dateFormat3 setDateFormat:@yyyy-M-dd];
    NSString *dating2 = [dateFormat3 stringFromDate:dte2];
    NSLog(@%@",dating2);



     


    de rien, mais la réponse d'Ali est de loins meilleure que le la mienne ;-)

  • Concernant la réponse d'Aligator, elle ne me convient pas trop dans le sens ou dans mon cas, c'est une application industrielle et non pour le grand public. Je ne peux pas tenir compte de la langue de préférence de l'utilisateur, en faite dans mon application (sorte de Borne interactive), il y a un écran de choix de langue. Donc je me sentais obligé d'utiliser setDateFormat. En tout cas merci à  vous pour votre aide.


     


    Bien à  vous.


  • Joanna CarterJoanna Carter Membre, Modérateur
    septembre 2014 modifié #7

    Soit ton app est pour l'industriel, soit il est pour le grand public, il y a beaucoup de differences entre les formats des dates selon le pays dans lequel l'utilisateur se trouve. Tu a dit qu'il y a un écran de choix de langue mais, si on choisissait l'anglais, le format des dates sera-t-il dd/M/yyyy (anglais britannique) ou M/dd/yyyy (anglais américain) ?


     


    Il y a une très bonne vidéo WWDC sur le sujet et, avec AliGator, je te conseillerais fortement de la voir et de lire les docs, sinon, l'app ne plairait pas certains utilisateurs.


  • AliGatorAliGator Membre, Modérateur
    septembre 2014 modifié #8

    Tout à  fait. Et le fait que ton app soit pour de l'industriel et que tu fasses un choix de langue au démarrage n'excuse pas qu'il faut adapter le format de date à  l'utilisateur et à  sa locale (ne pas confondre langue et locale, d'ailleurs, on peut avoir son iPhone/iPad en anglais UK mais utiliser un format de date américain si on veut, par exemple)


     


    N'oublie pas par exemple, comme c'est expliqué dans le Date Formatting Programming Guide cité plus haut et dans les vidéos WWDC citées par Joanna, qu'il existe des méthodes comme +[NSDateFormatter dateFormatFromTemplate:options:locale:] pour te générer un dateFormat (utilisable ensuite comme paramètre de "setDateFormat:") qui va coller à  une NSLocale donnée (genre celle que tu as choisie sur l'écran de démarrage de ton appli).


     


    [EDIT] Voir aussi ce fameux article de la Technical Q&A Apple sur les NSDateFormatters :

    If you're working with user-visible dates, you should avoid setting a fixed date format string because it's very hard to predict how your format string will be expressed in all possible user configurations. Rather, you should limit yourself to setting date and time styles (via -[NSDateFormatter setDateStyle:] and -[NSDateFormatter setTimeStyle:]) or generate your date format string from a template (using +[NSDateFormatter dateFormatFromTemplate:options:locale:]).

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