Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3058 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1573949
elojar
Posté le 12-06-2007 à 17:20:23  profilanswer
 

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
mood
Publicité
Posté le 12-06-2007 à 17:20:23  profilanswer
 

n°1573976
kashir
<a href="javascript:c.popup";>
Posté le 12-06-2007 à 17:38:15  profilanswer
 

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
n°1573981
omega2
Posté le 12-06-2007 à 17:41:08  profilanswer
 

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

n°1573985
kashir
<a href="javascript:c.popup";>
Posté le 12-06-2007 à 17:43:59  profilanswer
 

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
n°1573992
elojar
Posté le 12-06-2007 à 17:49:21  profilanswer
 

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

n°1573997
omega2
Posté le 12-06-2007 à 17:51:38  profilanswer
 

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

n°1573998
kashir
&lt;a href=&#034;javascript:c.popup&#034;;&gt;
Posté le 12-06-2007 à 17:52:19  profilanswer
 

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

n°1574002
kashir
&lt;a href=&#034;javascript:c.popup&#034;;&gt;
Posté le 12-06-2007 à 17:55:31  profilanswer
 

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
n°1574019
omega2
Posté le 12-06-2007 à 18:34:35  profilanswer
 

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.

n°1574021
kashir
&lt;a href=&#034;javascript:c.popup&#034;;&gt;
Posté le 12-06-2007 à 18:47:41  profilanswer
 

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

mood
Publicité
Posté le 12-06-2007 à 18:47:41  profilanswer
 

n°1574155
jeca
Posté le 13-06-2007 à 08:33:49  profilanswer
 

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
n°1574158
elojar
Posté le 13-06-2007 à 08:41:42  profilanswer
 

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 !

n°1574175
kashir
&lt;a href=&#034;javascript:c.popup&#034;;&gt;
Posté le 13-06-2007 à 09:25:30  profilanswer
 

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

n°1574188
anapajari
s/travail/glanding on hfr/gs;
Posté le 13-06-2007 à 09:50:15  profilanswer
 

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

n°1574189
elojar
Posté le 13-06-2007 à 09:51:49  profilanswer
 

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

n°1574237
jeca
Posté le 13-06-2007 à 10:59:05  profilanswer
 

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
n°1574239
omega2
Posté le 13-06-2007 à 11:02:41  profilanswer
 

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.

n°1574726
elojar
Posté le 14-06-2007 à 09:01:29  profilanswer
 

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

n°1574734
anapajari
s/travail/glanding on hfr/gs;
Posté le 14-06-2007 à 09:18:05  profilanswer
 

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

n°1574737
jeca
Posté le 14-06-2007 à 09:24:29  profilanswer
 

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.

n°1574738
elojar
Posté le 14-06-2007 à 09:27:03  profilanswer
 

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.

n°1574741
rufo
Pas me confondre avec Lycos!
Posté le 14-06-2007 à 09:31:42  profilanswer
 

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

n°1574747
elojar
Posté le 14-06-2007 à 09:48:19  profilanswer
 

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.

n°1574751
anapajari
s/travail/glanding on hfr/gs;
Posté le 14-06-2007 à 10:05:07  profilanswer
 

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]  
 

n°1574752
rufo
Pas me confondre avec Lycos!
Posté le 14-06-2007 à 10:05:25  profilanswer
 

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
n°1574754
jeca
Posté le 14-06-2007 à 10:08:03  profilanswer
 

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


Message édité par jeca le 14-06-2007 à 10:10:41
n°1574759
jeca
Posté le 14-06-2007 à 10:17:42  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
ACCESS Reprendre le numéro auto en cours dans un autre formulaireGénération de fichier xml à partir de php mysql. [Résolu]
[ACCESS] requete SQL max date[Résolu] Problème de return d'une fonction
Problème d'affichage avec la date (Anglais/Francais)[Resolu] [php/mySQL JS?] Case a cocher evenementielle.
[Résolu] phpMyAdmin et BRheure & date, c++ builder
clonage d'un objet recupere a partir d'un fichier XML 
Plus de sujets relatifs à : [Résolu-PHP]Connaitre le numéro de jour de l'année à partir d'une date


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR