[Résolu-PHP]Connaitre le numéro de jour de l'année à partir d'une date

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: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 :

Code :
  1. $annee=getdate('01.09.2007');
  2. print("$annee[yday]" );


ou

Code :
  1. $annee=getdate('d.m.Y','01.09.2007');
  2. print("$annee[yday]" );


 
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
Reply

Marsh Posté le 12-06-2007 à 17:20:23   

Reply

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 :D


Message édité par kashir le 12-06-2007 à 17:41:03
Reply

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]]]]]]] )
mktime — Retourne le timestamp UNIX d'une date

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? ;)

Reply

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 :
  1. <?php
  2. print_r(date_parse("2006-12-12 10:00:00.5" ));
  3. ?>
  4. L exemple ci-dessus va afficher :
  5. Array
  6. (
  7.     [year] => 2006
  8.     [month] => 12
  9.     [day] => 12
  10.     [hour] => 10
  11.     [minute] => 0
  12.     [second] => 0
  13.     [fraction] => 0.5
  14.     [warning_count] => 0
  15.     [warnings] => Array()
  16.     [error_count] => 0
  17.     [errors] => Array()
  18.     [is_localtime] =>
  19. )


Message édité par kashir le 12-06-2007 à 17:44:17
Reply

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é !

Reply

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 ...

Reply

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 ;)

Reply

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).
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 ...


 
 
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 :D.


Message édité par kashir le 12-06-2007 à 18:04:33
Reply

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.

Reply

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 :)  

Reply

Marsh Posté le 12-06-2007 à 18:47:41   

Reply

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 :
  1. <?php
  2.   $dateFr = '01/09/2007';
  3.   $dateMysql = implode('-', array_reverse(explode('/', $dateFr)));
  4.   $numJour = date('z', strtotime($dateMysql));
  5.   echo $numJour;
  6. ?>

Message cité 2 fois
Message édité par jeca le 13-06-2007 à 08:34:31
Reply

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 :p
 
Merci pour votre aide !

Reply

Marsh Posté le 13-06-2007 à 09:25:30    

Tente de faire une fonctions maison, tient nous au courant ;)

Reply

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 :
  1. $taDate='01.09.2007';
  2. $taDateReformatee = implode('-', array_reverse(explode('.', $dateFr)));
  3. $numJour = date('z', strtotime($taDateReformatee));
  4. echo $numJour;


 
Kashir> Arrête de dire n'importe quoi, stp merci ... :o

Reply

Marsh Posté le 13-06-2007 à 09:51:49    

J'y manquerais pas, à dans quelques jours (?)  :pt1cable:

Reply

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 :
  1. <?php
  2.   $dateFr = '10/02/2007';
  3.   $dateMysql = implode('-', array_reverse(explode('/', $dateFr)));
  4.   $numJour = date('z', strtotime($dateMysql)) + 1;
  5.   echo $numJour;
  6. ?>


Mais apparemment, tu cherches un version longue. Tu dois être payé au caractère, comme les journalistes.

Code :
  1. <?php
  2.   function estBissextile($annee)
  3.   {
  4.     if ((($annee % 4 == 0) && ($annee % 100 != 0)) || ($annee % 400 == 0))
  5.       return 1;
  6.     return 0;
  7.   }
  8.   function compteJour($annee, $mois, $jour)
  9.   {
  10.     $nbJourMois = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  11.     $bissextile = estBissextile($annee);
  12.     $nbJour = 0;
  13.     $i = 0;
  14.     while ($i < $mois - 1)
  15.     {
  16.       $nbJour += $nbJourMois[$i];
  17.       if ($i == 1)
  18.         $nbJour += $bissextile;
  19.       $i ++;
  20.     }
  21.     $nbJour += $jour;
  22.     return $nbJour;
  23.   }
  24.   //----------------------------------------------------
  25.   $dateFr = '10/02/2007';
  26.   $jour = substr($dateFr, 0, 2);
  27.   $mois = substr($dateFr, 3, 2);
  28.   $annee = substr($dateFr, 6);
  29.   $numJour = compteJour($annee, $mois, $jour);
  30.   echo $numJour;
  31. ?>


En se chatouillant encore un peu, on doit pouvoir faire plus long. Mais là, je laisse libre court à ton imagination.


Message édité par jeca le 13-06-2007 à 11:07:15
Reply

Marsh Posté le 13-06-2007 à 11:02:41    

jeca a écrit :

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 :
  1. <?php
  2.   $dateFr = '01/09/2007';
  3.   $dateMysql = implode('-', array_reverse(explode('/', $dateFr)));
  4.   $numJour = date('z', strtotime($dateMysql));
  5.   echo $numJour;
  6. ?>


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.

Reply

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 :
  1. <?php
  2. function nbj($fin){
  3. //si la date comporte 10 caractères on continue
  4. if (chr($fin, 2, 2) == "/" || strlen($fin) == 10)
  5. {
  6.  $djour = "31";
  7.  $dmois = "12";
  8.  $dannee = substr($fin, 6, 4)-1; //fin de l'année précédente
  9.  $dtimestamp = mktime(0, 0, 0, $dmois, $djour, $dannee);
  10.  $fjour = substr($fin, 0, 2); // on récupère le jour
  11.  $fmois = substr($fin, 3, 2); // puis le mois
  12.  $fannee = substr($fin, 6, 4); // et l'annee ...
  13.  //si la date est valide on continue
  14.  if (checkdate($fmois,$fjour,$fannee))
  15.  {
  16.   $ftimestamp = mktime(0, 0, 0, $fmois, $fjour, $fannee);
  17.   $nb_secondes = $ftimestamp - $dtimestamp;
  18.   // puis on tranforme en jours (arrondi inférieur)
  19.   $nb_jours = floor($nb_secondes / (60*60*24));
  20.   setlocale(LC_TIME, "fr" );
  21.  }
  22.  //sinon on met la variable à -1  
  23.  else
  24.  {
  25.   $nb_jours = -1;
  26.   echo "Date non valide";
  27.  }
  28. }
  29. //sinon on met la variable à -1  
  30. else
  31. {
  32.  $nb_jours = -1;
  33.  echo "La date doit être de forme JJ/MM/AAAA";
  34. }
  35. //on retourne le nombre de jour
  36. return $nb_jours;
  37. }
  38. echo nbj("2001/09/06" );
  39. ?>


 
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

Reply

Marsh Posté le 14-06-2007 à 09:18:05    

... c'est dépitant ...

Reply

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.

Reply

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.

Reply

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 :??:

Reply

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 :
  1. <?php
  2. echo date('z',strtotime("12/31/1999" ));
  3. ?>


 
Merci à tous.

Reply

Marsh Posté le 14-06-2007 à 10:05:07    

jeca a écrit :

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 :
  1. <?php
  2.   $dateFr = '01/09/2007';
  3.   $dateMysql = implode('-', array_reverse(explode('/', $dateFr)));
  4.   $numJour = date('z', strtotime($dateMysql));
  5.   echo $numJour;
  6. ?>



 

anapajari a écrit :

Elojar> Jeca t'a donné la solution parfait


 

elojar a écrit :

Bien vu rufo ça marche (plutôt) bien  :)  
Histoire de clouer le bec à jeca le code fait une seule ligne dommage.


 
 [:kains]  [:kains]  [:kains]  
 

Reply

Marsh Posté le 14-06-2007 à 10:05:25    

elojar a écrit :

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 :
  1. <?php
  2. echo date('z',strtotime("12/31/1999" ));
  3. ?>


 
Merci à tous.


 
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 :sarcastic:  
http://fr.php.net/manual/en/function.strtotime.php
 
+1 pour anapajari


Message édité par rufo le 14-06-2007 à 10:06:20
Reply

Marsh Posté le 14-06-2007 à 10:08:03    

Code :
  1. echo date('z', strtotime('12/31/1999')) + 1;


Message édité par jeca le 14-06-2007 à 10:10:41
Reply

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


Message édité par jeca le 14-06-2007 à 10:18:16
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed