Connaitre le numéro de jour de l'année à partir d'une date [Résolu-PHP] - PHP - Programmation
Marsh Posté le 12-06-2007 à 17:38:15
Je pense que tu devra faire toi meme la fonction, ça devrait pas etre trés dur
je t'aide:
Sont bisextiles (366 jours, soit un 29 fevrier), les années :
- divisibles par 4 mais non divisibles par 100
ou
-divisibles par 400
Ainsi, l'an 2004 était bissextile suivant la première règle. L'an 1900 n'était pas bissextile, car divisible par 100, ce qui va à l'encontre de la première règle, et non divisible par 400, ce qui va à l'encontre de la seconde. L'an 2000 était bissextile car divisible par 400.
Mais a mon avis tu devra utiliser la fonction substring() en javascipts, ou substr() en php pour convertir tes dates en format int, soit 01/05/2004 = 20040501, apres a toi de voir si ya d'autre possibilitée
Marsh Posté le 12-06-2007 à 17:41:08
http://fr2.php.net/manual/fr/function.date.php
Citation : "date ( string format [, int timestamp] )" |
donc il te faut la date au format "timestamp".
http://fr2.php.net/manual/fr/function.mktime.php
Citation : int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] ) |
Donc il te faut séparément chaque composant de la date pour obtenir un timestamp correspondant.
http://fr2.php.net/manual/fr/function.date-parse.php
Citation : date_parse — Retourne un tableau associatif avec des informations détaillées sur une date donnée |
Grace à ça, t'auras chaque composant de la date séparé dans des cases du tableau qu'il retourne.
En utilisant "date_parse" et "mktime", tu auras ta date dans le format "timestamp", ce qui te permettra d'avoir ensuite l'info voulut grace à la fonction "date()". C'est pas beau le php?
Marsh Posté le 12-06-2007 à 17:43:59
Je pense pas que l'ensemble de ces fonctions prennent en compte que l'année soit bisextiles ou pas :s
Code :
|
Marsh Posté le 12-06-2007 à 17:49:21
Ok je potasse ca.
Merci pour l'info kashir mais j'avais déjà fait la fonction bissextile, sachant que je crois que date("L" ) renvoi si l'année est bissextile ou pas mais ca je m'en suis rendu compte qu'après
omega2 je vois ca demain certainement et je verif si ca prend en compte ou pas les année bissextiles =)
Merci en tout cas, je donne des nouvelles dès que j'ai testé !
Marsh Posté le 12-06-2007 à 17:51:38
kashir > Si tu veux savoir si date_parse ou mktime gueule quand on lui donne une date invalide (par exemple le 29 févrié 2001) alors teste une date invalide (par exemple le fameux 29 févrié 2001).
C'est des fonctions qui sont utilisé tous les jours par des milliers de personnes alors ca m'étonerait qu'un bug dans la gestion des années bisextiles soit passé inaperçu pendant presque 10 ans.
Par contre, il y a beaucoup plus de risque avec ta méthode qui consiste à réinventer la roue vu qu'il faut alors s'amuser à gérer les années bisextiles, les mois en 28, 29, 30 et 31 jours ...
Marsh Posté le 12-06-2007 à 17:52:19
Mais entre Nous Elojar si tu arrive a gerer le fait que l'année soit a 366 ou 365 jours, c'est dans la poche ta juste a enlever 30,31, 29 ou 28 jours a chaque mois et le tour est jouer , j'avais deja fait ça en VB
Bonne chance
Marsh Posté le 12-06-2007 à 17:55:31
omega2 a écrit : kashir > Si tu veux savoir si date_parse ou mktime gueule quand on lui donne une date invalide (par exemple le 29 févrié 2001) alors teste une date invalide (par exemple le fameux 29 févrié 2001). |
Et bien tu as juste à gerer le mois de fevrier dans la fonction, depuis bien plus de 10 ans les mois de janvier et juillet on 31 jours, alors si tu réussi a trouver si l'année est bissextiles ou pas ta juste à ajouter un jour (ou pas ...) au mois de fevrier, je pense que ça prendrait moins de place et moins d'éxécution de fonction que ce que tu nous a proposer, apres c'est a voir laquelle offre le plus de garantie, je pense que tu as plus de bagage que moi en php .
Marsh Posté le 12-06-2007 à 18:34:35
D'un côté (le mien), on a trois traitements assez lourds fait en assembleur et un peu de php qui utilise un tableau.
Du tiens, on a que des traitements légé mais tout n'est fait qu'en php et donc interprété.
De ton côté, si je ne me trompes dans mes calculs, tu as :
- trois conditions dans un "if" permettant de savoir si c'est une année bisextiles
- trois substring + des multiplications + des aditions pour obtenir la date sous forme de nombre + des opérations pour ensuite reséparer l'année du mois et du jour (vu que de toute maniére, tu dois traiter les trois séparément) (1)
- une série d'addition (ou de soustraction si tu commences avec le nombre de jours dans l'année) mis dans une boucle
Finalement, il faudrait faire des tests pour voir lequel des deux s'exécutes le plus vite, vu que l'un a des traitements un peu plus lourds mais en assembleur là où l'autre en a des plus légé mais plus nombreux et en interprété.
(1) D'ailleurs, je n'ai même pas compris l'intéret de la date sour forme de nombre. C'est du boulot inutile, mieux vaut avoir l'année séparément pour savoir si c'est bisextile, le mois séparément pour savoir combien de jour doit être décompté avant le début du mois courant et le jour dans le mois pour savoir combien on doit rajouter au nombre de jours précédant le début du mois.
Marsh Posté le 12-06-2007 à 18:47:41
omega2 a écrit : (1) D'ailleurs, je n'ai même pas compris l'intéret de la date sour forme de nombre. C'est du boulot inutile, mieux vaut avoir l'année séparément pour savoir si c'est bisextile, le mois séparément pour savoir combien de jour doit être décompté avant le début du mois courant et le jour dans le mois pour savoir combien on doit rajouter au nombre de jours précédant le début du mois. |
Tu as raison pour ça en effet, je pensais à du javascript sur le coup mais finalement ça ne servirait pas a grd chose de ce servir de cette fonction.
Pour ma solution comme tu l'a dit, il devra isoler l'année, le mois, et le jours. Sur ce point on est d'accord, mais c'est vrai que l'implantation est peut etre un peu plus dur mais offre plus de garantie que la mienne car elle a fait ses preuve
Marsh Posté le 13-06-2007 à 08:33:49
Bonjour,
Si la date disponible est au format 'JJ/MM/AAAA', et s'il s'agit de récupérer le N° du jour dans l'année, je pense que ceci doit largement suffire :
Code :
|
Marsh Posté le 13-06-2007 à 08:41:42
Bonjour,
bon j'ai regardé un peu ! En fait je plantais sur un problème, notamment avec la fonction date_parse() qui n'est pas compatible avec ma version de php (j'utilise easyphp 1.8 qui a la version 4.3.10) et celle de free est inférieure à 5.2.0.
Va falloir que je trouve une alternative plus compatible
Merci pour votre aide !
Marsh Posté le 13-06-2007 à 09:25:30
Tente de faire une fonctions maison, tient nous au courant
Marsh Posté le 13-06-2007 à 09:50:15
Elojar> Jeca t'a donné la solution parfaite, si on reprend ton code du début ça donne:
Code :
|
Kashir> Arrête de dire n'importe quoi, stp merci ...
Marsh Posté le 13-06-2007 à 10:59:05
Il y a un bug dans mon code, les jours sont numértotés à partir de 0 :
Code :
|
Mais apparemment, tu cherches un version longue. Tu dois être payé au caractère, comme les journalistes.
Code :
|
En se chatouillant encore un peu, on doit pouvoir faire plus long. Mais là, je laisse libre court à ton imagination.
Marsh Posté le 13-06-2007 à 11:02:41
jeca a écrit : Bonjour,
|
Bien vu, je n'étais pas descendus jusqu'aux commentaires de la doc et j'ai crus (même si je trouvais ça bizare) qu'elle se cantonait à des "10 September 2000" et autres façon litérrale d'indiquer les dates.
Marsh Posté le 14-06-2007 à 09:01:29
Hello et merci pour vos réponses =)
Moi j'ai un code qui ressemble à ça :
Code :
|
Je suis en train de rajouter des contraintes, déjà je gère la validité de la date par exemple le 32 janvier 2000 existe pas et je le signale. Et je vais faire une contrainte sur la chaîne qui doit être du type JJ/MM/AAAA et non pas MM/JJ/AAAA ou que sais-je. Si vous voyez d'autres contraintes ou si ma fonction contient une "faille" faites m'en part =)
Merci
Marsh Posté le 14-06-2007 à 09:24:29
Je ne dirai qu'un mot : BRAVO.
J'étais arrivé à 32 lignes de code, et tu en as 40. Fais encore un petit effort, les 50 lignes sont en vue.
Marsh Posté le 14-06-2007 à 09:27:03
Vive l'ironie... Quand j'essaie de faire quelquechose j'essaie de le faire bien histoire de rencontrer le moins de bug possible. Enfin bon chacun rigole avec ce qu'il peut.
Marsh Posté le 14-06-2007 à 09:31:42
j'ai juste une question Elojar : qu'est-ce que tu as contre le paramètre 'z' de la fonction date()??? Ca fait pile poil ce dont tu as besoin. Faut juste lui passer en 2ième paramètre une date souf forme d'un timesamp, facilement récupérable grâce à strtotime().
Alors pourquoi tant de haine contre cette fonction et t'obstiner à faire une fonction aussi longue
Marsh Posté le 14-06-2007 à 09:48:19
Bien vu rufo ça marche (plutôt) bien
Histoire de clouer le bec à jeca le code fait une seule ligne dommage.
Solution parmi les solutions :
Code :
|
Merci à tous.
Marsh Posté le 14-06-2007 à 10:05:07
jeca a écrit : Bonjour,
|
anapajari a écrit : Elojar> Jeca t'a donné la solution parfait |
elojar a écrit : Bien vu rufo ça marche (plutôt) bien |
Marsh Posté le 14-06-2007 à 10:05:25
elojar a écrit : Bien vu rufo ça marche (plutôt) bien
|
strtotime ne prend que des dates au format anglais, donc je doute que ça te donne le bon résultat avec une date en fr
http://fr.php.net/manual/en/function.strtotime.php
+1 pour anapajari
Marsh Posté le 14-06-2007 à 10:08:03
Code :
|
Marsh Posté le 14-06-2007 à 10:17:42
Pour ceux que ça intéresse, la fonction 'strtotime()' suit la syntaxe décrite ici :
http://www.gnu.org/software/tar/manual/html_node/tar_109.html
Marsh Posté le 12-06-2007 à 17:20:23
Bonjour,
j'essaie en php d'afficher le numéro du jour à partir d'une date. Par exemple, si l'on entre le 01/01/2001, ca affiche 1 et si on entre le 31/12/2001 ca affiche 365.
J'ai cherché un peu dans les fonctions, le date("z" ) y ressemble mais renvoi seulement le numéro du jour d'aujourd'hui. Une autre idée, avec le getdate(), en fesant apelle à l'array yday, mais je n'arrive pas à lui mettre comme paramètre (à la fonction) autre chose que la date d'aujourd'hui.
Je sais pas si on peut assigner une date préformatée dans une variable avant de rentrer ce que l'on souhaite dans le getdate() ?
J'ai essayé un truc du genre :
ou
Enfin, j'en passe et des meilleurs, qui je suppose font faire dresser plus d'un cheveux sur la tête ^^
Donc voilà, est-ce que quelqu'un aurait une idée de : comment afficher le numéro du jour, par exemple le 01/09/2007, en prenant en compte les années bisextiles ou est-ce que je suis obligé de me tapper la fonction de A à Z.
Merci d'avance.
Message édité par elojar le 14-06-2007 à 09:48:52