PHP : transformations de date, calcul d’âge, fonctions utiles

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

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)

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)

Exemple : $date = "25/08/1975";
La fonction retourne : 236

Transforme une date (jj/mm/aaaa) en Timestamp Unix

Exemple : $date = "25/08/1975";
La fonction retourne : 178153200

Transforme un Timestamp Unix en numéro de jour (entre 1 et 366)

Exemple : $timestamp = "178153200";
La fonction retourne : 236

Transforme un Timestamp Unix en date (jj/mm/aaaa)

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.

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

Exemple : $jour = "236"; $annee = "1975";
La fonction retourne : 178066800

2 réflexions sur « PHP : transformations de date, calcul d’âge, fonctions utiles »

  1. Lionel

    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!

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *