Date et semaines avec PHP

Date et semaines avec PHP - PHP - Programmation

Marsh Posté le 19-04-2007 à 19:16:58    

Bonjour,

 

L'un des trucs le plus casse couille, la gestion/manipulation des dates.
Je cherche à faire 2 choses :

 

1- Ecrire une fonction que me renvoi le nombre de semaines dans l'année passée en paramètre.

 
Code :
  1. function nbSemaine($annee){
  2.     ...
  3.     return $nbSemaine;
  4. }
 

2- Une autre fonction me donnerais la donnerais la date complète du lundi par rapport au numéro de semaine passé en paramètre

Code :
  1. function dateLundi($noSemaine){
  2.     ...
  3.     return $date; //Renvoi de la date du lundi au format YYYY-MM-DD de la semaine passée en paramètre
  4. }
 

Si quelqu'un pouvait me donner un coup de main .

 

Merci à tous

Reply

Marsh Posté le 19-04-2007 à 19:16:58   

Reply

Marsh Posté le 19-04-2007 à 19:26:10    

c'est pas vraiment ce que les règles du forum racontent, t'es gentil mais il va falloir que tu écrives un peu plus que les signatures des fonctions pour qu'on t'aide...


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 19-04-2007 à 19:31:17    

Code :
  1. function nbSemaine($annee){
  2.     $w = date('w', mktime(0,0,0,31,12,$annee));
  3.     return $w;
  4. }


bon y'a surrement mieux
tu devrais pouvoir faire pareil pour ton autre fonction
http://fr.php.net/mktime


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 19-04-2007 à 20:19:01    

@zapan666 : Merci beaucoup pour ton aide.

 

@TotalRecal l : Qu'est ce qui te permet de me parler ainsi ? J'ai été poli dans mon message donc "t'es gentil", la prochaine fois tu t'abstiens si c'est pour poster des message sans intérets. De plus, difficile d'être plus explicite.
C'est dingue le nombre de mec qui te prenne de haut sur ce forum de programmation. Sortez prendre l'air de temps en temps, ça vous rendra moins aigri.

 

Message cité 1 fois
Message édité par NoiBe49 le 19-04-2007 à 20:20:14
Reply

Marsh Posté le 19-04-2007 à 20:27:05    

Bah des semaines y'en a toujours 52  [:pingouino]  
 
Si tu veux une donnée utile, il te faut le premier lundi avant de début de l'année
 
J'ai fais ça perso :

Code :
  1. //Get first day of the year and first monday of the year
  2. $firstDay = mktime(0, 0, 0, 1, 0, $currentYearViewed);
  3. $firstMondayInYear = strtotime('first Monday', $firstDay);


 
Après mattes la fonction strtotime, tu lui fileras le nombre de semaines en plus que tu veux par rapport à la premiere semaine de l'année (qui commence par un lundi, ici $firstMondayInYear)


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 19-04-2007 à 20:34:12    

NoiBe49 a écrit :

@zapan666 : Merci beaucoup pour ton aide.

 

@TotalRecal l : Qu'est ce qui te permet de me parler ainsi ? J'ai été poli dans mon message donc "t'es gentil", la prochaine fois tu t'abstiens si c'est pour poster des message sans intérets. De plus, difficile d'être plus explicite.
C'est dingue le nombre de mec qui te prenne de haut sur ce forum de programmation. Sortez prendre l'air de temps en temps, ça vous rendra moins aigri.


http://forum.hardware.fr/hfr/Progr [...] 4544_1.htm -> ce forum n'a pas pour vocation de faire le boulot des autres, juste de les aider.

 

Ta question pourrait etre un énoncé d'un devoir. Or, tu n'as strictement rien fait pour y répondre apparemment, tu as choisi la solution de facilité en nous demandant de nous palucher le travail.
[:spamafote]


Message édité par TotalRecall le 19-04-2007 à 20:34:24

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 20-04-2007 à 12:22:55    

Shinuza a écrit :

Bah des semaines y'en a toujours 52  [:pingouino]  


pas con :whistle:  


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 20-04-2007 à 16:42:44    

Shinuza a écrit :

Bah des semaines y'en a toujours 52  [:pingouino]


 
Salut, pas tout à fait vrai , il en a de 52 à 54 ...
http://www.merlyn.demon.co.uk/weekinfo.htm#CWpCY
mçme si pour le 54 je comprends moins bien.

Reply

Marsh Posté le 20-04-2007 à 17:46:55    

sub1 a écrit :

Salut, pas tout à fait vrai , il en a de 52 à 54 ...
http://www.merlyn.demon.co.uk/weekinfo.htm#CWpCY
mçme si pour le 54 je comprends moins bien.


Citation :

weeks or part-weeks

 [:pingouino]  
 
Ce qui revient de toutes façons à 52 semaines, et la technique que je donne tiens compte des bouts de semaines, vu qu'on part toujours du premier lundi de l'année (ou de l'année précedente)
 
Mon algo fonctionne très bien  :o  :o  :o  :o  :o


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 21-04-2007 à 10:40:16    

Bonjour,

 

Les semaines d'une année peuvent être numérotées de 1 à 53. Cela se reproduit alternativement
tous les 5 et 6 ans. Exemple : les années 1998, 2004, 2009, 2015, etc... comportent une semaine N° 53.

 

D'autre part, en utilisant le 31-12 pour récupérer le nombre de semaines, sans test, peut donner un résultat totalement erroné. Exemple : le 31-12-2007 se trouve dans la semaine N° 1 de l'année 2008. Dans ce cas, le nombre de semaines sera le N° de semaine du dimanche précédent.

 

Pour déterminer la date du lundi de la semaine N° xx, le code de Shinuza ne fonctionnera pas à chaque fois, car le 1er lundi de janvier n'est pas obligatoirement le lundi de la semaine N° 1. Exemple : le lundi de la semaine N° 1 en 2008 est le 31-12-2007, alors que la fonction de Shinuza retourne 07-01-2008. Je rappelle que la semaine N° 1 est la semaine qui contient le 1er jeudi de janvier (norme ISO 8601), ce qui signifie que, si le 1er janvier est mardi, mercredi ou jeudi, le lundi de la semaine N° 1 est le lundi précédent, et non pas le 1er lundi de janvier.


Message édité par jeca le 21-04-2007 à 11:11:37
Reply

Marsh Posté le 21-04-2007 à 10:40:16   

Reply

Marsh Posté le 21-04-2007 à 12:05:35    

Euh, juste pour dire que j'ai testé mon algo jusqu'a 2038 (la date ou php plante) et les dates/semaines correspondent, libre à vous de faire ce que vous voulez ensuite...
Et je vois pas ou j'ai dis que le premier lundi de janvier était le lundi de semaine N°1, mon algo récupère - bordel - la première semaine complète (donc qui commence par un lundi certes) mais la première de l'année.
Donc en 2008 il récupèrera du lundi 31-12-2007 au dimanche 06-01-2008, et la semaine d'avant se terminera le dimanche 30-12-2007 :o :o :o :o


Message édité par Shinuza le 21-04-2007 à 12:13:36

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 22-04-2007 à 19:15:15    

Désolé, je me suis effectivement planté dans mes explications. Mais ce que tu appelle un algo n'en est pas un puisqu'il s'agit simplement d'un appel à une fonction native.

 

Cela dit, pour toutes les années ci-dessous, ça ne fonctionne pas :

 

php 4.4.6
1975 => date retournée par la fonction : 1975-01-06 -- date attendue : 1974-12-30
1976 => date retournée par la fonction : 1976-01-05 -- date attendue : 1975-12-29
1981 => date retournée par la fonction : 1981-01-05 -- date attendue : 1980-12-29
1986 => date retournée par la fonction : 1986-01-06 -- date attendue : 1985-12-30
1987 => date retournée par la fonction : 1987-01-05 -- date attendue : 1986-12-29
1992 => date retournée par la fonction : 1992-01-06 -- date attendue : 1991-12-30
1997 => date retournée par la fonction : 1997-01-06 -- date attendue : 1996-12-30
1998 => date retournée par la fonction : 1998-01-05 -- date attendue : 1997-12-29
2003 => date retournée par la fonction : 2003-01-06 -- date attendue : 2002-12-30
2004 => date retournée par la fonction : 2004-01-05 -- date attendue : 2003-12-29
2009 => date retournée par la fonction : 2009-01-05 -- date attendue : 2008-12-29
2014 => date retournée par la fonction : 2014-01-06 -- date attendue : 2013-12-30
2015 => date retournée par la fonction : 2015-01-05 -- date attendue : 2014-12-29
2020 => date retournée par la fonction : 2020-01-06 -- date attendue : 2019-12-30
2025 => date retournée par la fonction : 2025-01-06 -- date attendue : 2024-12-30
2026 => date retournée par la fonction : 2026-01-05 -- date attendue : 2025-12-29
2031 => date retournée par la fonction : 2031-01-06 -- date attendue : 2030-12-30
2032 => date retournée par la fonction : 2032-01-05 -- date attendue : 2031-12-29
2037 => date retournée par la fonction : 2037-01-05 -- date attendue : 2036-12-29

 

php 5.2.1
1974 => date retournée par la fonction : 1974-01-07 -- date attendue : 1973-12-31
1975 => date retournée par la fonction : 1975-01-06 -- date attendue : 1974-12-30
1976 => date retournée par la fonction : 1976-01-05 -- date attendue : 1975-12-29
1980 => date retournée par la fonction : 1980-01-07 -- date attendue : 1979-12-31
1981 => date retournée par la fonction : 1981-01-05 -- date attendue : 1980-12-29
1985 => date retournée par la fonction : 1985-01-07 -- date attendue : 1984-12-31
1986 => date retournée par la fonction : 1986-01-06 -- date attendue : 1985-12-30
1987 => date retournée par la fonction : 1987-01-05 -- date attendue : 1986-12-29
1991 => date retournée par la fonction : 1991-01-07 -- date attendue : 1990-12-31
1992 => date retournée par la fonction : 1992-01-06 -- date attendue : 1991-12-30
1997 => date retournée par la fonction : 1997-01-06 -- date attendue : 1996-12-30
1998 => date retournée par la fonction : 1998-01-05 -- date attendue : 1997-12-29
2002 => date retournée par la fonction : 2002-01-07 -- date attendue : 2001-12-31
2003 => date retournée par la fonction : 2003-01-06 -- date attendue : 2002-12-30
2004 => date retournée par la fonction : 2004-01-05 -- date attendue : 2003-12-29
2008 => date retournée par la fonction : 2008-01-07 -- date attendue : 2007-12-31
2009 => date retournée par la fonction : 2009-01-05 -- date attendue : 2008-12-29
2013 => date retournée par la fonction : 2013-01-07 -- date attendue : 2012-12-31
2014 => date retournée par la fonction : 2014-01-06 -- date attendue : 2013-12-30
2015 => date retournée par la fonction : 2015-01-05 -- date attendue : 2014-12-29
2019 => date retournée par la fonction : 2019-01-07 -- date attendue : 2018-12-31
2020 => date retournée par la fonction : 2020-01-06 -- date attendue : 2019-12-30
2025 => date retournée par la fonction : 2025-01-06 -- date attendue : 2024-12-30
2026 => date retournée par la fonction : 2026-01-05 -- date attendue : 2025-12-29
2030 => date retournée par la fonction : 2030-01-07 -- date attendue : 2029-12-31
2031 => date retournée par la fonction : 2031-01-06 -- date attendue : 2030-12-30
2032 => date retournée par la fonction : 2032-01-05 -- date attendue : 2031-12-29
2036 => date retournée par la fonction : 2036-01-07 -- date attendue : 2035-12-31
2037 => date retournée par la fonction : 2037-01-05 -- date attendue : 2036-12-29

 

Compte tenu de résultats différents en fonction de la version de php, et dans tous les cas erronés, je donnerais comme code - bordel - :

 
Code :
  1. $firstDay = mktime(0, 0, 0, 1, 1, $annee);
  2. $firstMondayInYear = strtotime('first Monday', $firstDay);
  3. $lundi = (date('W', $firstMondayInYear) > 1) ?
  4.           date('Y-m-d', strtotime('last monday', $firstMondayInYear)) :
  5.           date('Y-m-d', $firstMondayInYear);
 

qui, lui, retourne bien la date du lundi de la semaine N° 1.


Message édité par jeca le 22-04-2007 à 19:25:48
Reply

Marsh Posté le 23-04-2007 à 14:16:28    

Il me semble que la fonction strftime("%u" ) (je crois qu'il s'agit de celle-là) renvoie la semaine actuelle (comptée depuis le 1er janvier de l'année en cours).
A partir de là, il est facile de trouver le nombre de semaines passées ;) (en décrémentant strftime de 1).


Message édité par biboo_ le 23-04-2007 à 14:19:52
Reply

Marsh Posté le 23-04-2007 à 18:01:46    

ou pas, le premier de l'année peut être un lundi, du coup tu te retrouves avec s-1.
 
@eca : Je répète, j'ai testé le système jusqu'en 2038 :sarcastic: et oui j'ai un système qui permet de vérifier si le premier de l'année est un lundi  :sarcastic:²


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 24-04-2007 à 09:21:57    

@shinuza : le but n'est pas de trouver la date du 1er lundi de l'année, ce que retourne ta fonction, mais la date du lundi de la semaine N° 1, ce qui n'est pas du tout la même chose, car si le 1er janvier est un mardi, mercredi ou jeudi, le lundi de la semaine N° 1 est le dernier lundi de l'année précédente, et le 1er lundi de l'année se trouve donc dans la semaine N° 2.

Reply

Marsh Posté le 24-04-2007 à 19:50:35    

http://imatt.us/mt/archives/orly.JPG
 
T'es vraiment, vraiment long à comprendre, mais vraiment.
 
Ma "fonction" retourne le premier lundi de l'année, et vérifie s'il fait parti de la première semaine, ok?
 
Prenons un exemple : Janvier 2010.
 
Le premier lundi de l'année est un 4 qui arrive dans la semaine 2, ma fonction (je n'ai pas tout posté, c'est censé d'une être utilisé et vendu en entreprise et deux cela risque moyennement d'aider NoiBe49 que de lui macher le travail) vérifie si le premier de l'année est un lundi :
 
-Si oui, elle retourne la première semaine de l'année
-Si non, elle récupère la semaine entière a partir du premier de l'année en l'occurence un vendredi et va chercher le bout de semaine manquant, finalement j'ai une semaine qui s'établie comme suit : Du lundi 28-12-2009 au dimanche 03-01-2010


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 25-04-2007 à 09:01:53    

Excellente argumentation, mais résultat de l'exemple totalement faux :

  • 28-12-2009  --  03-01-2010  = semaine N° 53 de l'année 2009
  • 04-01-2010  --  10-01-2010  = semaine N° 1 de l'année 2010


Selon la norme ISO 8601, la semaine N° 1 (exprimé de différentes manières mais équivalentes) est :

  • la première qui comporte au moins 4 jours de janvier,
  • celle dans laquelle se trouve le premier jeudi de janvier,
  • celle dans laquelle se trouve le 4 janvier.


Donc, si "c'est censé ... être utilisé et vendu en entreprise", à ta place, je m'empresserais de revoir la copie avant que ça se voit. D'autre part, "cela risque moyennement d'aider NoiBe49" que de l'orienter sur une mauvaise piste.

 

Ceci est ma dernière contribution à cette discussion qui ne présente plus aucun intérêt, vu que tout a été dit.

 

Cependant, une dernière chose : T'es vraiment, vraiment long à comprendre, mais vraiment. Une seule règle : la norme ISO 8601


Message édité par jeca le 25-04-2007 à 09:40:04
Reply

Marsh Posté le 25-04-2007 à 16:32:11    

Je vois pas ou est votre problème, cela marche très bien dans cette exemple d'un calendrier semaine par semaine, vous pouvez tester :
 

Code :
  1. <?php
  2. // Si une semaine précise est demandée en GET, sinon on prendra la semaine en cours
  3. if(isset($_GET["semaine"]))
  4. {
  5.  $semaine = $_GET["semaine"];
  6. }
  7. else
  8. {
  9.  //Jour dans la semaine... Lundi = 0
  10.  $jour = (date('w') - 1);
  11.  //Différence en secondes par rapport au lundi
  12.  $difference = $jour * 86400;
  13.  //On récupère le TimeStamp du lundi
  14.  $semaine = (mktime() - $difference);
  15. }
  16. //Semaine en cours
  17. $semaine_en_cours = date('W', $semaine);
  18. //TimeStamp Lundi précédant
  19. $semaine_precedente = $semaine - 604800;
  20. //TimeStamp Lundi suivant
  21. $semaine_suivante = $semaine + 604800;
  22. ?>
  23. <html>
  24. <head>
  25. <title>Calendrier semaine par semaine <? echo $semaine_en_cours; ?></title>
  26. <script type="text/javascript">
  27.  //Initialisation de la variable "msg"
  28.  var msg = "";
  29.  //Action appelée lorsqu'on clique sur une date.
  30.  function actionDate(time, e)
  31.  {
  32.   //Clic avec le bouton droit (la gestion est différente d'un navigateur à un autre)
  33.   if( (!document.all && e.which == 3) || (document.all && event.button == 2))
  34.    {
  35.     msg = "Clic droit: " + time;
  36.    }
  37.   //Clic avec le bouton gauche
  38.   else
  39.    {
  40.     msg = "Clic gauche: " + time;
  41.    }
  42.   alert(msg);
  43.   //return(true); //Non utilisé ici... Syntaxiquement correct
  44.  }
  45.  //Fonction qui désactive le menu du clic droit :)
  46.  function no_menu()
  47.  {
  48.   return(false);
  49.  }
  50.  // On appele la fonction "no_menu" si le menu du clic droit est appelé
  51.  document.oncontextmenu = no_menu;
  52. </script>
  53. </head>
  54. <body>
  55. <div align="center">
  56.  <a href="?semaine=<? echo $semaine_precedente; ?>"><<</a>&nbsp;Semaine&nbsp;<? echo $semaine_en_cours; ?>&nbsp;<a href="?semaine=<? echo $semaine_suivante; ?>">>></a>
  57. </div>
  58. <table align="center" border="1" width="100%">
  59.  <tr>
  60.   <td align="center"><b>Lundi</b></td>
  61.   <td align="center"><b>Mardi</b></td>
  62.   <td align="center"><b>Mercredi</b></td>
  63.   <td align="center"><b>Jeudi</b></td>
  64.   <td align="center"><b>Vendredi</b></td>
  65.   <td align="center"><b>Samedi</b></td>
  66.   <td align="center"><b>Dimanche</b></td>
  67.  </tr>
  68.  <tr>
  69.   <?
  70.   //Pour chaque jour de la semaine... Lundi = 1
  71.   for($i=1;$i<8;$i++)
  72.   {
  73.    //Il s'agit d'aujourd'hui!
  74.    if( ($i == date('w')) && ($semaine_en_cours == date('W')) )
  75.    {
  76.     ?>
  77.     <td align="center" style="background-color:#FFFF00;" onMouseUp="actionDate('<? echo date('d M Y', $semaine); ?>', event)">
  78.      <? echo date('d M Y', $semaine); ?>
  79.     </td>
  80.     <?
  81.    }
  82.    else
  83.    {
  84.     ?>
  85.     <td align="center" style="background-color:#FFFFFF;" onMouseUp="actionDate('<? echo date('d M Y', $semaine); ?>', event)">
  86.      <? echo date('d M Y', $semaine); ?>
  87.     </td>
  88.     <?
  89.    }
  90.    //On passe au jour suivant
  91.    $semaine += 86400;
  92.   }
  93.   ?>
  94.  </tr>
  95. </table>
  96. </body>
  97. </html>


Message édité par xdoomer01 le 25-04-2007 à 16:59:09
Reply

Sujets relatifs:

Leave a Replay

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