NSDate: format par défaut.

AntilogAntilog Membre
02:07 modifié dans API AppKit #1
Salut,

Soit une NSOutlineView dont l'une des colonnes contient un objet NSDate.
Sans traitement particulier, la NSOutlineView affiche correctement la date, ce qui est bien  :D , mais au format long, très long .

Je souhaiterais n'afficher cette date qu'au format court, j'ai cherché un peu partout, je m'attendais à  trouver une méthode du style
[NSDate setDefaultFormat:NSShortDateFormat]

ou bien même
[[NSUserDefaults standardUserDefaults] setObject:@"ShortDateFormat" forKey:NSDateFormat]

Mais rien, il semble que le type de format de date (court ou long) ne soit pas paramètrable.

Il me semble que je pourrais me rattraper sur :
[[NSUserDefaults standardUserDefaults] setObject:@"..." forKey:NSDateFormatString]

ça devrait correspondre à  mon besoin, mais ce n'est pas vraiment ce que je voulais faire, je changerais ainsi le format long de la date, m'interdisant de l'utiliser dans le programme...

Ai-je loupé quelque chose ( :'( ) ou quoi?
Il y a peut-être une solution simple?

Merci,
Frédéric

Réponses

  • aranaudaranaud Membre
    02:07 modifié #2
    Pourquoi n'utilise tu pas ceci (voir capture) ?

    [Fichier joint supprimé par l'administrateur]
  • cargocargo Membre
    02:07 modifié #3
    Oui, ou drag&drop d'un textField format date sur la colonne ça marche bien aussi, comme ça tu fais ton choix dans le formatter.
  • AntilogAntilog Membre
    02:07 modifié #4
    Ben.... parce que...

    1. Je ne sais pas réellement me servir du NSDateFormatter, il y manque (pour moi) une case à  cocher qui existe dans le NSNumberFormatter : "localize".
    Si je choisis %m/%d/%y, j'aimerais qu'il m'affiche %d/%m/%y en français, et je ne sais pas comment faire (sans programmation  :fouf): )

    2. J'ai eu bien du mal à  me débarrasser de problèmes avec les fuseaux horaires et le changement d'heure été/hiver grâce à  :
    [NSTimeZone setDefaultTimeZone:]
    en passant toutes les dates/heures à  GMT+0, avec l'affichage par défaut j'ai bien GMT+0, mais avec le formatter il recommence à  me changer l'heure  >:D

    Ceci dit, je note l'endroit où se trouvent (dans la palette IB) les objets qu'on peut placer dans la NSOutlineView  <3 , je savais pas...
  • 02:07 modifié #5
  • AntilogAntilog Membre
    02:07 modifié #6
    dans 1143827043:

    Oui, j'avais trouvé ce post, je voudrais quelque chose dans ce genre, mais comme ma date est en objet dans un dictionnaire qui est datasource de l'outline view...
    Je pense que pour utiliser cette ligne, je devrais stocker une NSString au lieu d'une NSDate, ça me plaà®t moyen  :o
  • mars 2006 modifié #7
    et?

    tu peux stocker sous forme de date et renvoyer la description de la date, ce n'est vraiment pas un problème. Il faut juste penser à  faire la transformation inverse si tu permets les modifications.
  • AntilogAntilog Membre
    02:07 modifié #8
    Je sais, je suis un ch...

    En fait, tu as raison, je vois bien où et comment le faire, mais ça fait du code en plus et je suis fainéant...
    Non, c'est surtout que je ne comprends pas pourquoi ça n'a pas été prévu, je pensais réellement que j'avais loupé quelque chose de très simple et d'évident, comme souvent  :o

    Merci pour toutes vos réponses,

  • aranaudaranaud Membre
    02:07 modifié #9
    dans 1143826298:

    Si je choisis %m/%d/%y, j'aimerais qu'il m'affiche %d/%m/%y en français, et je ne sais pas comment faire (sans programmation  :fouf): )

    Voir mon poste précédant.
    Dans le choix du format de la date du remplace %m/%d/%y par %d/%m/%y avec le clavier.
  • AntilogAntilog Membre
    02:07 modifié #10
    dans 1143890968:

    dans 1143826298:

    Si je choisis %m/%d/%y, j'aimerais qu'il m'affiche %d/%m/%y en français, et je ne sais pas comment faire (sans programmation  :fouf): )

    Voir mon poste précédant.
    Dans le choix du format de la date du remplace %m/%d/%y par %d/%m/%y avec le clavier.


    Excuses-moi, je n'ai pas été assez clair...
    Je voudrais pouvoir choisir un format 'universel' et le voir localisé en fonction des coutumes locales. Je pourrais bien sûr avoir deux versions localisées, US + Fr, mais dans ce cas, les allemands (au hasard), utiliseraient probablement le nib anglais, et auraient donc la date en mois-jour-année, je ne suis pas certain que ça leur plaise (si mes lointains souvenirs de langue vivante ne me font pas défaut, l'allemand utilise la date dans le même ordre que le français).
  • avril 2006 modifié #11
    Dans ce cas, je vois vraiment pas ce que tu reproches à  la solution que je t'ai préconisée.

    Si deux lignes de code te font peur parce que tu t'imaginais qu'une solution existerait en une, le seul conseil que je puisse te donner est d'arrêter de programmer.
  • Eddy58Eddy58 Membre
    02:07 modifié #12
    C'est un poisson d'avril Antilog ? :P ;)
  • cargocargo Membre
    02:07 modifié #13
    La solution zéro ligne de code :
    - drag&drop d'un textField formaté date dans ta colonne
    - choisir %c dans le formatter
    - cocher "allows natural language" (ça veut bien dire ce que ça veut dire)

    Le format correspondra à  celui défini par l'utilisateur dans Prefs/International/Format, donc logiquement à  celui de sa langue naturel. Ta colonne sera formatée non seulement pour us/fr/de mais aussi pour le Zimbabwe ou le Kashakstan.  :)
    Evidemment si tu forces un ordre jour/mois/année dans le formatter, il ne va pas localiser.
    Ce qui n'est pas normal c'est que la checkbox est toujours active si tu choisis %A, %B %e, %Y par exemple.

    Ce qui est dommage c'est qu'il ne propose pas plus de choix au niveau du format localisé : c% c'est vraiment LA date avec h:mn et nom du fuseau horaire.
    Je vais chercher un peu voir s'il n'existe pas un autre format "global" mais plus court.

    A noter que dans CoreData, j'ai trouvé tout seul comme un grand un truc qui marche : en valeur par défaut de l'entité, si on met: today , la date du jour est affichée par défaut dans le champ formaté date.
  • cargocargo Membre
    avril 2006 modifié #14
    Voilà  les format strings disponibles :
    http://developer.apple.com/documentation/Cocoa/Conceptual/DataFormatting/index.html?http://developer.apple.com/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatterSyntax.html

    Au niveau localisation automatique on a donc:
    %x > Date + Fuseau horaire
    %X > Heure
    %p > AM/PM (en fonction de la localisation)
    %c > équivaut à  %X %x"

    Par contre, seul %c et %p fonctionnent dans IB.
    %X et x% me renvoient systématiquement %c au final.


    PS: Il y a des différences au niveau du formatage avec 10.4
  • Eddy58Eddy58 Membre
    02:07 modifié #15
    dans 1143962460:

    - cocher "allows natural language" (ça veut bien dire ce que ça veut dire)

    Cette option n'a rien à  voir avec la localisation, elle autorise le controle à  substituer les dates de type JJ/MM/AAAA (ou autre suivant la localisation) par leurs équivalents "naturels" (Today, Tomorrow, etc...) :o
  • BruBru Membre
    avril 2006 modifié #16
    Il faut juste rappeler un truc :

    NSDate sert à  stocker une date (ou une heure). Point à  la ligne.

    Dès l'instant où on doit afficher cette date (ou en récupérer certaines parties), il faut utiliser d'autres mécanismes :

    Avant 10.4 : il faut utiliser NSCalendarDate en utilisant le paramètre locale. locale est un NSDictionary contenant certaines clés utilisées pour le formatage. Les réglages par défaut (liés à  la configuration du système) sont stockés dans les usersDefaults :
    NSString *dateAffichable=[monCalendarDate descriptionWithLocale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
    

    C'est la solution donnée par Renaud quelques posts plus haut.

    A partir de 10.4 : Apple a marqué NSCalendarDate comme probablement "deprecatable" à  court terme. Une nouvelle classe NSCalendar permet de stocker le format d'une date. Par format, il faut entendre la manière dont une date peut être affichée, les différentes parties que l'on peut récupérer, etc... NSCalendar est fortement lié à  la localisation du système, et aussi aux réglages de l'utilisateur du panneau de préférence "Date et Heure".

    NSCalendar peut s'utiliser de 2 façons : soit en passant par un NSDictionary locale :
    NSString *dateAffichable=[monCalendarDate descriptionWithLocale:[[NSCalendar currentCalendar] locale]];
    


    Soit en passant par un dateFormatter :
    <br />dateFormateur=[[NSDateFormatter alloc] init];<br />[dateFormateur setFormatterBehavior:NSDateFormatterBehavior10_4];<br />NSString *dateAffichable=[dateFormateur stringForObjectValue:maDate];<br />[dateFormateur release];
    

    Dans ce cas, un objet NSDate suffit pour le stockage de la date.

    .
  • cargocargo Membre
    02:07 modifié #17
    Apparemment ça peut poser un souci. Par exemple, moi je souhaite le jour de la semaine dans la date pour pouvoir ensuite faire un search sur le jour. Si je choisis un formatter local de type Full dans le code, je ne suis pas sûr que le jour apparaisse dans ma date car l'utilisateur peut avoir customisé ses formats en supprimant le jour dans le format Full...(si j'ai bien compris)

    Cette option n'a rien à  voir avec la localisation

    Désolé, comme j'utilise "today" évidemment ça ne marchait pas en décochant la case, c'est ce qui m'a trompé... o:)
  • Eddy58Eddy58 Membre
    02:07 modifié #18
    dans 1144085755:

    Par exemple, moi je souhaite le jour de la semaine dans la date pour pouvoir ensuite faire un search sur le jour. Si je choisis un formatter local de type Full dans le code, je ne suis pas sûr que le jour apparaisse dans ma date car l'utilisateur peut avoir customisé ses formats en supprimant le jour dans le format Full...(si j'ai bien compris)

    Le formatter est juste là  pour préparer la date à  l'affichage, il n'agit pas sur les attributs de ton objet NSDate ou NSCalendarDate. Pour ta recherche, tu utilises la méthode dayOfWeek de NSCalendarDate sur chacune de tes dates. :)
  • AntilogAntilog Membre
    02:07 modifié #19
    dans 1144049377:

    []
    A partir de 10.4 : Apple a marqué NSCalendarDate comme probablement "deprecatable" à  court terme. Une nouvelle classe NSCalendar permet de stocker le format d'une date. Par format, il faut entendre la manière dont une date peut être affichée, les différentes parties que l'on peut récupérer, etc... NSCalendar est fortement lié à  la localisation du système, et aussi aux réglages de l'utilisateur du panneau de préférence "Date et Heure".

    NSCalendar peut s'utiliser de 2 façons : soit en passant par un NSDictionary locale :
    NSString *dateAffichable=[monCalendarDate descriptionWithLocale:[[NSCalendar currentCalendar] locale]];
    


    Soit en passant par un dateFormatter :
    <br />dateFormateur=[[NSDateFormatter alloc] init];<br />[dateFormateur setFormatterBehavior:NSDateFormatterBehavior10_4];<br />NSString *dateAffichable=[dateFormateur stringForObjectValue:maDate];<br />[dateFormateur release];
    

    Dans ce cas, un objet NSDate suffit pour le stockage de la date.

    .


    Merci Bru  <3 <br />C'est exactement ce que je cherchais!  :p

    Pour les personnes sur ce forum qui pourraient se trouver vexées que je ne reprenne pas leur solution ( :(renaud):), je tiens à  préciser (peut-être ne suis-je pas clair malgrès mes efforts) :
    Modifier l'objet pour passer une NSString au lieu d'une NSDate est faisable, je ne suis pas fainéant au point de ne pas vouloir la coder, mais je considère mordicus que je dois pouvoir envoyer une date, et m'arranger pour qu'elle s'affiche correctement et sous une forme localisée sans avoir à  changer l'objet. Partant de là , je ne me résoudrais à  cette méthode que si je n'en trouve pas d'autre qui me plaise plus, intellectuellement.
    Si j'avais eu une date à  insérer dans un champ, englobée par du texte, cette méthode m'aurait paru la plus pertinente. Dans mon cas, non. Un NSFormatter est bien plus approprié (encore une fois, à  mon avis).

    J'avais trouvé,  un peu avant le post de Bru:
    NSString *dateFormatString = [[NSUserDefaults standardUserDefaults]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  stringForKey:NSShortTimeDateFormatString];<br />NSDateFormatter *formatter = [[NSDateFormatter alloc]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; initWithDateFormat:dateFormatString allowNaturalLanguage:NO]; <br />
    

    suivi d'un:
    [[monOutlet dataCell] setFormatter:formatter];<br />	[formatter release];<br />
    

    J'avais remarqué que je n'avais pas accès à  tous les formats possibles de date, mais avec la méthode de Bru, j'ai droit à  tout (la limitation à  Mac OS X.4 ne me pose pas de problème, actuellement):
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];<br />	[formatter setFormatterBehavior:NSDateFormatterBehavior10_4];<br />	[formatter setDateStyle:NSDateFormatterShortStyle];<br />	[formatter setTimeStyle:NSDateFormatterShortStyle];<br />
    


    J'obtiens exactement ce que je veux...
    Ca va, j'ai dépassé les deux lignes de code, je peux peut-être rester dans la programmation :-*

    Merci encore à  tous!
  • avril 2006 modifié #20
    dans 1144858692:

    J'avais remarqué que je n'avais pas accès à  tous les formats possibles de date, mais avec la méthode de Bru, j'ai droit à  tout (la limitation à  Mac OS X.4 ne me pose pas de problème, actuellement):


    Dans ce cas plutôt que d'utiliser une NSTextCell, il vaut mieux utiliser une NSDatePickerCell (à  ne pas confondre avec un NSDateFormatter), qui tient justement compte de toutes ces spécificités. (Drag'n'drop de l'élément où il est écrit 08/04 (palette des tables) sur de la colonne qui t'intéresse, pour le personnaliser il suffit de cliquer sur le triangle qui apparait dans l'entête de colonne). Seul hic, il n'y a pas moyen de changer la taille.
  • GercofisGercofis Membre
    02:07 modifié #21
    Je bricole dans le même type de problème avec CoreData...
    Une date saisie comme ça génère une erreur...

    23/2/07 ?

    Par contre

    saisie 2/23/07 va être affichée 23/02/2007...

    Dois-je envisager un transformateur peut-être si oui comment je fais ?
Connectez-vous ou Inscrivez-vous pour répondre.