Quelle prise de tête, pour un programmeur amateur, dès qu’il s’agit de calculer correctement l’âge d’une personne à partir de la date de naissance ! Ou de transformer des dates en numéro de semaine ou en numéro de jour dans l’année, ou de faire l’opération inverse… Gérer les années bisextiles, les mois qui n’ont pas le même nombre de jours, etc. Voici quelques fonctions en PHP qui feront gagner du temps.
En fait, PHP permet de gérer correctement la plupart des problèmes évoqués. Mais comment bien utiliser les fonctions natives de PHP ? Confronté à ce problème, et n’étant pas un « PHP guru », j’ai dû chercher des exemples, éplucher la documentation de PHP pour arriver à ce que je voulais : des fonctions simples à utiliser.
Je suppose que ma date (variable $date ) d’entrée est au format "d/m/Y" selon la syntaxe PHP, ce qui correspond à jj/mm/aaaa, par exemple 25/08/1975.
Notez qu’il n’y a pas 52 semaines dans une année… mais un peu plus. La 53e semaine est incomplète (exemple : 2015). De plus, la 1re semaine ne commence pas forcément le 1er janvier, puisque les semaines débutent par un lundi. La 1re semaine commence à partir du premier lundi de l’année. Ce qui veut dire aussi que le 1er janvier se trouve parfois dans la semaine 53 de l’année précédente…
Calcul de l’âge à partir de la date de naissance
Le calcul précis d’un âge (exprimé en années entières, comme par exemple « j’ai 34 ans ») ne se résume pas à faire âge = (date d'aujourd'hui) – (date de naissance). Le résultats de (date d'aujourd'hui) – (date de naissance) donne un nombre de jours, qu’il ne faut pas diviser par 365 pour obtenir un nombre d’années, en raison des années bissextiles (366 jours). Or comment savoir par quel nombre diviser, entre 365 et 366 ? 365,25 n’est pas la bonne réponse, à moins d’accepter un jour d’écart avec la réalité. (J’ai bien dit calcul précis 😉 ) Cela demanderait de repérer, entre la date de naissance et la date d’aujourd’hui, combien il y a eu d’années bissextiles… Ça fait mal à la tête, et c’est trop compliqué.
Voilà la solution (trouvée sur un forum ou un site dont je n’ai hélas pas noté le lien ; que sont auteur soit remercié) :
1 2 3 4 5 6 7 8 |
// Calcule l'âge à partir d'une date de naissance jj/mm/aaaa function Age($date_naissance) { $am = explode('/', $date_naissance); $an = explode('/', date('d/m/Y')); if(($am[1] < $an[1]) || (($am[1] == $an[1]) && ($am[0] <= $an[0]))) return $an[2] - $am[2]; return $an[2] - $am[2] - 1; } |
Traduit en français, cet algorithme serait :
- si le mois de naissance est antérieur au mois actuel, ou bien, si le jour de naissance est inférieur ou égal au jour actuel lorsque le mois de naissance est égal au mois actuel, alors l’âge est la différence entre l’année en cours et l’année de naissance.
- sinon l’âge est la différence entre l'(année en cours – 1) et l’année de naissance.
Calcul du numéro de semaine (entre 1 et 53) à partir d’une date (jj/mm/aaaa)
1 2 3 4 5 6 |
// Transforme une date jj/mm/aaaa en numéro de semaine function Date2Semaine($date) { $am = explode('/', $date); return date("W", mktime(0,0,0,$am[1],$am[0],$am[2])); } |
Exemple :
$date = "25/08/1975";
La fonction retourne : 35
Calcul du numéro de jour dans l’année (entre 1 et 366) à partir d’une date (jj/mm/aaaa)
1 2 3 4 5 6 |
// Transforme une date jj/mm/aaaa en numéro du jour function Date2Jour($date) { $am = explode('/', $date); return date("z", mktime(0,0,0,$am[1],$am[0],$am[2])); } |
Exemple :
$date = "25/08/1975";
La fonction retourne : 236
Transforme une date (jj/mm/aaaa) en Timestamp Unix
1 2 3 4 5 6 |
// Transforme une date jj/mm/aaaa en Timestamp Unix function Date2Timestamp($date) { $am = explode('/', $date); return mktime(0,0,0,$am[1],$am[0],$am[2]); } |
Exemple :
$date = "25/08/1975";
La fonction retourne : 178153200
Transforme un Timestamp Unix en numéro de jour (entre 1 et 366)
1 2 3 4 5 |
// Transforme un Timestamp Unix en numéro du jour function Timestamp2Jour($timestamp) { return date("z", $timestamp); } |
Exemple :
$timestamp = "178153200";
La fonction retourne : 236
Transforme un Timestamp Unix en date (jj/mm/aaaa)
1 2 3 4 5 6 7 8 |
// Transforme un Timestamp Unix en date jj/mm/aaaa function Timestamp2Date($timestamp,$format) { if ($format == "") { $format="d/m/Y"; } return date($format, $timestamp); } |
Exemple :
$timestamp = "178153200";
La fonction retourne : 25/08/1975
Calcule un Timestamp Unix à partir d’un numéro de semaine (entre 1 et 53) et d’une année (aaaa)
Notez qu’il n’est pas possible de définir exactement une date, rien qu’avec un numéro de semaine et une année. Il manquerait l’information sur le jour (lundi à dimanche).
Cette fonction considère donc le lundi (premier jour de la semaine) de la semaine en question.
1 2 3 4 5 |
// Transforme un numéro de semaine et une année en Timestamp Unix du premier jour de la semaine function SemaineAn2Timestamp($semaine,$annee) { return strtotime(date($annee).'W'.$semaine."1"); } |
Si vous préférez considérer un autre jour, remplacez le « 1 » par un autre numéro de jour (« 2 » pour mardi, …, « 7 » pour dimanche).
Exemple :
$semaine = "35"; $annee = "1975";
La fonction retourne : 178153200 (même timestamp que pour 25/08/1975 car ce jour était un lundi.)
Calcule un Timestamp Unix à partir d’un numéro de jour (entre 1 et 366) et d’une année (aaaa)
Notez qu’il faut ces 2 informations pour pouvoir définir exactement la date… Si $jour dépasse le nombre de jours dans l’année $annee , alors il n’y a pas d’erreur (exemple : le 366e jour de 1975 n’existe pas, c’est le 1er jour de 1976 qui sera considéré).
1 2 3 4 5 6 7 |
// Transforme un numéro de jour et une année en Timestamp Unix function JourAn2Timestamp($jour,$annee) { $d = new DateTime($annee.'-01-01'); date_modify($d, '+'.($jour-1).' days'); return $d->getTimestamp(); } |
Exemple :
$jour = "236"; $annee = "1975";
La fonction retourne : 178066800
T’inquiètes les pro ont le même problème, par contre ils ne font pas de PHP et surtout ils ont fait fortune avec ces problèmes en 98/99!
OK je suis « un peu » en retard sur les pros, mais ce n’est pas grave 😉