{"id":566,"date":"2016-11-23T22:08:08","date_gmt":"2016-11-23T21:08:08","guid":{"rendered":"http:\/\/darrigan.net\/blog\/?p=566"},"modified":"2025-03-26T17:04:02","modified_gmt":"2025-03-26T16:04:02","slug":"php-transformations-date-calcul-age","status":"publish","type":"post","link":"https:\/\/darrigan.net\/blog\/php-transformations-date-calcul-age\/","title":{"rendered":"PHP : transformations de date, calcul d&rsquo;\u00e2ge, fonctions utiles"},"content":{"rendered":"<p>Quelle prise de t\u00eate, pour un programmeur amateur, d\u00e8s qu&rsquo;il s&rsquo;agit de calculer <em>correctement<\/em> l&rsquo;\u00e2ge d&rsquo;une personne \u00e0 partir de la date de naissance ! Ou de transformer des dates en num\u00e9ro de semaine ou en num\u00e9ro de jour dans l&rsquo;ann\u00e9e, ou de faire l&rsquo;op\u00e9ration inverse\u2026 G\u00e9rer les ann\u00e9es bisextiles, les mois qui n&rsquo;ont pas le m\u00eame nombre de jours, etc. Voici quelques fonctions en PHP qui\u00a0feront gagner du temps.<!--more--><\/p>\n<p>En fait, PHP permet de g\u00e9rer correctement la plupart des probl\u00e8mes \u00e9voqu\u00e9s. Mais comment bien utiliser les fonctions natives de PHP ? Confront\u00e9 \u00e0 ce probl\u00e8me, et n&rsquo;\u00e9tant pas un \u00ab\u00a0PHP guru\u00a0\u00bb, j&rsquo;ai d\u00fb chercher des exemples, \u00e9plucher la documentation de PHP pour arriver \u00e0 ce que je voulais : des fonctions simples \u00e0 utiliser.<\/p>\n<p>Je suppose que ma date (variable <span class=\"lang:php decode:true crayon-inline\">$date<\/span>\u00a0) d&rsquo;entr\u00e9e est au format <span class=\"lang:php decode:true crayon-inline\">\u00ab\u00a0d\/m\/Y\u00a0\u00bb<\/span>\u00a0selon la syntaxe PHP,\u00a0ce qui correspond \u00e0 jj\/mm\/aaaa, par exemple 25\/08\/1975.<\/p>\n<p>Notez qu&rsquo;il n&rsquo;y a pas\u00a052 semaines dans une ann\u00e9e\u2026 mais un peu plus. La 53<sup>e<\/sup> semaine\u00a0est incompl\u00e8te (exemple : 2015). De plus, la 1<sup>re<\/sup> semaine ne commence pas forc\u00e9ment le 1<sup>er<\/sup> janvier, puisque les semaines d\u00e9butent par un lundi. La 1<sup>re<\/sup>\u00a0semaine commence \u00e0 partir du premier lundi de l&rsquo;ann\u00e9e. Ce qui veut dire aussi que le 1er janvier se trouve parfois dans la\u00a0semaine 53 de l&rsquo;ann\u00e9e pr\u00e9c\u00e9dente&#8230;<\/p>\n<h2>Calcul de l&rsquo;\u00e2ge \u00e0 partir de la date de naissance<\/h2>\n<p>Le <em>calcul pr\u00e9cis<\/em> d&rsquo;un \u00e2ge (exprim\u00e9 en ann\u00e9es enti\u00e8res, comme par exemple \u00ab\u00a0j&rsquo;ai 34 ans\u00a0\u00bb) ne se r\u00e9sume pas \u00e0 faire <span class=\"lang:default highlight:0 decode:true crayon-inline\">\u00e2ge = (date d&rsquo;aujourd&rsquo;hui) \u2013 (date de naissance)<\/span>. Le r\u00e9sultats de <span class=\"lang:default highlight:0 decode:true crayon-inline \">(date d&rsquo;aujourd&rsquo;hui) \u2013 (date de naissance)<\/span>\u00a0 donne un nombre de jours, qu&rsquo;il ne faut pas diviser par 365 pour obtenir un nombre d&rsquo;ann\u00e9es, en raison des ann\u00e9es bissextiles (366 jours). Or comment savoir par quel nombre diviser, entre 365 et 366 ? 365,25 n&rsquo;est pas la bonne r\u00e9ponse, \u00e0 moins d&rsquo;accepter un jour d&rsquo;\u00e9cart avec la r\u00e9alit\u00e9. (J&rsquo;ai bien dit <em>calcul pr\u00e9cis<\/em> \ud83d\ude09 ) Cela demanderait de rep\u00e9rer, entre la date de naissance et la date d&rsquo;aujourd&rsquo;hui, combien il y a eu d&rsquo;ann\u00e9es bissextiles\u2026 \u00c7a fait mal \u00e0 la t\u00eate, et c&rsquo;est trop compliqu\u00e9.<\/p>\n<p>Voil\u00e0 la solution (trouv\u00e9e sur un forum ou un site dont je n&rsquo;ai h\u00e9las pas not\u00e9 le lien ; que sont auteur soit remerci\u00e9) :<\/p>\n<pre class=\"lang:php decode:true\">\/\/ Calcule l'\u00e2ge \u00e0 partir d'une date de naissance jj\/mm\/aaaa\r\nfunction Age($date_naissance)\r\n{\r\n$am = explode('\/', $date_naissance);\r\n$an = explode('\/', date('d\/m\/Y'));\r\nif(($am[1] &lt; $an[1]) || (($am[1] == $an[1]) &amp;&amp; ($am[0] &lt;= $an[0])))\u00a0return $an[2] - $am[2];\r\nreturn $an[2] - $am[2] - 1;\r\n}<\/pre>\n<p>Traduit en fran\u00e7ais, cet algorithme serait :<\/p>\n<ul>\n<li>si le mois de naissance est ant\u00e9rieur au mois actuel, ou bien, si le jour de naissance est inf\u00e9rieur\u00a0ou \u00e9gal au jour actuel lorsque le mois de naissance est \u00e9gal au mois actuel, alors l&rsquo;\u00e2ge est la diff\u00e9rence entre l&rsquo;ann\u00e9e en cours et l&rsquo;ann\u00e9e de naissance.<\/li>\n<li>sinon l&rsquo;\u00e2ge\u00a0est la diff\u00e9rence\u00a0entre l'(ann\u00e9e en cours \u2013 1) et l&rsquo;ann\u00e9e\u00a0de naissance.<\/li>\n<\/ul>\n<h2>Calcul du num\u00e9ro de semaine (entre 1 et 53) \u00e0 partir d&rsquo;une date (jj\/mm\/aaaa)<\/h2>\n<pre class=\"lang:php decode:true\">\/\/ Transforme une date jj\/mm\/aaaa en num\u00e9ro de semaine\r\nfunction Date2Semaine($date)\r\n{\r\n$am = explode('\/', $date);\r\nreturn date(\"W\", mktime(0,0,0,$am[1],$am[0],$am[2]));\r\n}<\/pre>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline \">$date = \u00ab\u00a025\/08\/1975\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne : 35<\/p>\n<h2>Calcul du num\u00e9ro de jour dans l&rsquo;ann\u00e9e (entre 1 et 366) \u00e0 partir d&rsquo;une date\u00a0(jj\/mm\/aaaa)<\/h2>\n<pre class=\"lang:php decode:true \">\/\/ Transforme une date jj\/mm\/aaaa en num\u00e9ro du jour\r\nfunction Date2Jour($date)\r\n{\r\n$am = explode('\/', $date);\r\nreturn date(\"z\", mktime(0,0,0,$am[1],$am[0],$am[2]));\r\n}<\/pre>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline \">$date = \u00ab\u00a025\/08\/1975\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne : 236<\/p>\n<h2>Transforme\u00a0une date\u00a0(jj\/mm\/aaaa)\u00a0en Timestamp Unix<\/h2>\n<pre class=\"lang:php decode:true\">\/\/ Transforme une date jj\/mm\/aaaa en Timestamp Unix\r\nfunction Date2Timestamp($date)\r\n{\r\n$am = explode('\/', $date);\r\nreturn mktime(0,0,0,$am[1],$am[0],$am[2]);\r\n}<\/pre>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline\">$date = \u00ab\u00a025\/08\/1975\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne : 178153200<\/p>\n<h2>Transforme\u00a0un Timestamp Unix en num\u00e9ro de jour (entre 1 et 366)<\/h2>\n<pre class=\"lang:php decode:true\">\/\/ Transforme un Timestamp Unix en num\u00e9ro du jour\r\nfunction Timestamp2Jour($timestamp)\r\n{\r\nreturn date(\"z\", $timestamp);\r\n}<\/pre>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline \">$timestamp = \u00ab\u00a0178153200\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne :\u00a0236<\/p>\n<h2>Transforme\u00a0un Timestamp Unix en\u00a0date\u00a0(jj\/mm\/aaaa)<\/h2>\n<pre class=\"lang:php decode:true\">\/\/ Transforme un Timestamp Unix en date jj\/mm\/aaaa\r\nfunction Timestamp2Date($timestamp,$format)\r\n{\r\nif ($format == \"\") {\r\n$format=\"d\/m\/Y\";\r\n}\r\nreturn date($format, $timestamp);\r\n}<\/pre>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline \">$timestamp = \u00ab\u00a0178153200\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne :\u00a025\/08\/1975<\/p>\n<h2>Calcule\u00a0un Timestamp Unix \u00e0 partir d&rsquo;un num\u00e9ro de semaine\u00a0(entre 1 et 53) et d&rsquo;une ann\u00e9e (aaaa)<\/h2>\n<p>Notez qu&rsquo;il n&rsquo;est pas possible de d\u00e9finir <em>exactement<\/em> une date, rien qu&rsquo;avec un num\u00e9ro de semaine et une ann\u00e9e. Il manquerait l&rsquo;information sur le jour (lundi \u00e0 dimanche).<\/p>\n<p>Cette fonction consid\u00e8re donc le\u00a0<strong>lundi<\/strong> (premier jour de la semaine) de la semaine en question.<\/p>\n<pre class=\"lang:php decode:true\">\/\/ Transforme un num\u00e9ro de semaine et une ann\u00e9e en Timestamp Unix du premier jour de la semaine\r\nfunction SemaineAn2Timestamp($semaine,$annee)\r\n{\r\nreturn strtotime(date($annee).'W'.$semaine.\"1\");\r\n}<\/pre>\n<p>Si vous pr\u00e9f\u00e9rez consid\u00e9rer un autre jour, remplacez le \u00ab\u00a01\u00a0\u00bb par un autre num\u00e9ro de jour (\u00ab\u00a02\u00a0\u00bb pour mardi, \u2026, \u00ab\u00a07\u00a0\u00bb pour dimanche).<\/p>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline\">$semaine = \u00ab\u00a035\u00a0\u00bb; $annee = \u00ab\u00a01975\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne : 178153200\u00a0(m\u00eame timestamp que pour\u00a025\/08\/1975 car ce jour \u00e9tait un lundi.)<\/p>\n<h2>Calcule\u00a0un Timestamp Unix \u00e0 partir d&rsquo;un num\u00e9ro de jour (entre 1 et 366) et d&rsquo;une ann\u00e9e (aaaa)<\/h2>\n<p style=\"text-align: left;\">Notez qu&rsquo;il faut\u00a0ces 2 informations pour pouvoir d\u00e9finir exactement la date\u2026 Si <span class=\"lang:default highlight:0 decode:true crayon-inline\">$jour<\/span>\u00a0 d\u00e9passe le nombre de jours dans l&rsquo;ann\u00e9e <span class=\"lang:default highlight:0 decode:true crayon-inline \">$annee<\/span>\u00a0, alors il n&rsquo;y a pas d&rsquo;erreur (exemple : le 366<sup>e<\/sup> jour de 1975 n&rsquo;existe pas, c&rsquo;est le 1<sup>er<\/sup> jour de 1976 qui sera consid\u00e9r\u00e9).<\/p>\n<pre class=\"lang:php decode:true\">\/\/ Transforme un num\u00e9ro de jour et une ann\u00e9e en Timestamp Unix\r\nfunction JourAn2Timestamp($jour,$annee)\r\n{\r\n$d = new DateTime($annee.'-01-01');\r\ndate_modify($d, '+'.($jour-1).' days');\r\nreturn $d-&gt;getTimestamp();\r\n}\r\n<\/pre>\n<p>Exemple : <span class=\"lang:php decode:true crayon-inline \">$jour = \u00ab\u00a0236\u00a0\u00bb; $annee = \u00ab\u00a01975\u00a0\u00bb;<\/span><br \/>\nLa fonction\u00a0retourne : 178066800<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quelle prise de t\u00eate, pour un programmeur amateur, d\u00e8s qu&rsquo;il s&rsquo;agit de calculer correctement l&rsquo;\u00e2ge d&rsquo;une personne \u00e0 partir de la date de naissance ! Ou de transformer des dates en num\u00e9ro de semaine ou en num\u00e9ro de jour dans l&rsquo;ann\u00e9e, ou de faire l&rsquo;op\u00e9ration inverse\u2026 G\u00e9rer les ann\u00e9es bisextiles, les mois qui n&rsquo;ont pas [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[39],"tags":[65,54,53,70,55,64],"_links":{"self":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts\/566"}],"collection":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/comments?post=566"}],"version-history":[{"count":17,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts\/566\/revisions"}],"predecessor-version":[{"id":633,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/posts\/566\/revisions\/633"}],"wp:attachment":[{"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/media?parent=566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/categories?post=566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/darrigan.net\/blog\/wp-json\/wp\/v2\/tags?post=566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}