NSDate: format par défaut.
Antilog
Membre
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 , 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
ou bien même
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 :
ç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
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 , 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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[Fichier joint supprimé par l'administrateur]
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 , je savais pas...
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
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.
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
Merci pour toutes vos réponses,
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).
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.
- 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.
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
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...)
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 :
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 :
Soit en passant par un dateFormatter :
Dans ce cas, un objet NSDate suffit pour le stockage de la date.
.
Désolé, comme j'utilise "today" évidemment ça ne marchait pas en décochant la case, c'est ce qui m'a trompé...
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.
Merci Bru <br />C'est exactement ce que je cherchais!
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:
suivi d'un:
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):
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!
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.
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 ?