Dernier jour du mois
olof
Membre
Question peut-être un peu bête, mais je sèche.
Je suis en train de dessiner un calendrier du mois courant. Comment faire pour trouver le dernier jour d'un mois donné ?
Mai -> 31
Merci !
Je suis en train de dessiner un calendrier du mois courant. Comment faire pour trouver le dernier jour d'un mois donné ?
Mai -> 31
Merci !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
31,28,31,30,31,30,31,31,30,31,30,31
(et ajouter 1 à février pour tous les multiples de 400 ou les multiples de 4 non multiples de 100)
Ouf, je n'aimerais pas faire les calculs moi-même !
+
Chacha
Et si jamais, on peut faire un poil plus simple. Au lien de passer par le nombre de jour, on cherche le permier jour du mois suivant et on lui "ajoute" -1 jour.
Woah, c'est osé ! Enfin, s'ils ont prévu des "int" c'est que ça doit marcher. Pas bête !
+
Chacha
[edit]
En fait c'est écrit noir sur blanc dans la doc...
C'est le jour de la semaine qu'on cherche ??
Je cherchais (vu que c'est bon maintenant) la dernière date d'un mois donné. Mai 2007 -> 31.5.2007 par exemple.
Tous les mois de Mai ont 31 jours, donc Mai **** -> 31
Pareil pour tous les autres mois, sauf Février qui a 28 jours ou 29 les années bissextiles (multiples de 400 ou multiples de 4 non multiples de 100)
Pourquoi donc faire des calculs aussi complexes avec deux objets NSCalendarDate là où un tableau statique suffit ??
J'ai envie de dire : "moins de code = moins de bugs". En fait, avec NSCalendarDate, c'est réglé en une ligne de code (création de la date, enlever un jour,récupérer le dayOfMonth).
Après, tu as tout à fait raison, ce n'est pas tellement plus compliqué de le faire avec un tableau...
+
Chacha
Ben moi j'ai envie de dire "moins de passage par des objets 'boà®tes noires' = moins de bugs et plus d'optimisation" :P (dans la limite du raisonnable bien sûr... Je ne vais pas m'amuser à aller recoder NSString !)
Là passer par un NSCalendarDate c'est pourquoi faire simple quand on peut faire compliqué ???
Aller calculer des différences de dates avec des timeZone et compagnie pour trouver combien de jours a un mois, ça me donne mal à la tête ;D
Et puis faut pas oublier que dans "Objective-C", il y a "C" :P
Je crois que si on compte en nombre de caractères, y a pas photo :P (sans parler d'une comparaison en terme de simplicité...)
En effet si on raisonne vite fait sans trop connaà®tre le domaine, on peut se dire qu'on fait un bête tableau à 12 valeurs et on prend la bonne valeur. Point barre. Et là , on utilise, on teste un peu, et oups, on s'aperçoit qu'on a oublié les années bisextiles. Bon alors on rajoute. Comme on s'y connais pas trop, on rajoute un jours si l'année est multiple de 4 et point barre... et on oublie les cas particuliers des multiples de 100 non multiples de 400... (ce qui n'est pas qqch que tout le monde connait, entre nous).
Bref, à le faire à la main, il faut penser à tous les cas particuliers... même quand on pense qu'il n'y en a pas (ici le problème paraà®t simple alors qu'il y a quand même des cas un peu spéciaux, par exemple). Alors qu'avec NSCalendarDate, on est sûr que toutes les subtilités sont prévues.
D'ailleurs c'est dommage qu'on ne puisse passer que des unsigned dans le constructeur. En PHP par exemple on peut demander le -5/14/2007 et il va nous créer la date qui est "6 jours avant le 01/14/2007" soit 6 jours avant le 01/02/2008... soit le 26/01/2008. Très pratique pour ce genre de cas (passer au mois suivant ou reculer d'un certain nombre de jours sans ce soucier des bounds 1-12 pour les mois ou 1-N pour les jours).
Pour le cas présent, je persiste à dire que c'est la presse hydraulique pour écraser une mouche.
Surtout que ceux qui ont programmé ces classes sont humains comme nous et ont aussi pu laisser des bugs (de domaine d'action très restreint, cas rares etc. certes).
Encore "overkill" ? J'ai déjà oublié ce que ça veut dire  :fouf):
Effectivement, ça serait intéressant de savoir comment on gère un calendrier Chinois ou autre... (à mon avis, il faut se faire sa propre classe NSDate).
Mais bon, comme tu m'as grillé sur ce coup j'allais justement écrire ce que tu as mis en citation. Mais en passant par NSCalendar, on peut jouer avec les différents calendriers.
Il faut mapper le système du calendrier sur un système jour/semaine/mois/année...
Autant dire que c'est inutilisable pour pas mal de calendriers.
En plus, il faut coder soi même les calendriers ; il n'y a pas les classes toutes faites ; le seul truc qu'il gère automatiquement est le calendrier Julien qui n'est plus utilisé nulle part...
Mais de toute façon, à la limite, on s'en fout:
- en général, le seul calendrier qui compte c'est le calendrier choisi par l'utilisateur (qui est [tt][NSCalendar currentCalendar][/tt].
- même si le calendrier qu'on veut gérer n'est pas géré pour le moment, ça ne veut pas dire qu'il le sera jamais: un tel code l'avantage de toujours rester valable.
Pour répondre à la question:
[tt]
NSDate *date = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
fromDate:date];
[dateComponents setMonth:[dateComponents month]+1];
[dateComponents setDay:-1];
dateComponents = [cal components:NSDayCalendarUnit
fromDate:[cal dateFromComponents:dateComponents]];
NSLog(@%i,[dateComponents day]+1);
[/tt]
L'idéal étant bien entendu de ranger ça dans une petite catégorie de NSDate pour que le code reste lisible (je le dis car beaucoup de gens ne pensent pas spontanément à créer des catégories pour "quelques lignes").
Défini dans NSLocale.h
Par contre, je ne sais pas si le concept de "nombre de jours dans un mois" ou "dernier jour d'un mois" existe avec ces calendriers...