TUTORIELS 
PHP : compter en jours, mois, années...
"Je souhaiterai non pas afficher que le nombre de jours entre 2 dates, mais aussi le nombre de mois et d'années. En fait, le but serait d'afficher ceci sur mon site : 'le site est ouvert depuis X ans, X mois et X jours'."  (29 Février 2004)
 
Forums
* Discutez en sur les forums
"Je souhaiterai non pas afficher que le nombre de jours entre 2 dates, mais aussi le nombre de mois et d'années. En fait, le but serait d'afficher ceci sur mon site : 'le site est ouvert depuis X ans, X mois et X jours'."

Un problème, une interrogation ? Adressez-vous à la rédaction de JDNet Développeurs

Malgré notre article "Manipulation de la date en PHP", certains calculs peuvent encore être compliqués à réaliser. Nous allons ici pousser la complétude en affichant le temps sous cette forme : "5 ans, 7 mois, 2 semaines, 5 jours, 14 heures, 37 minutes et 29 secondes".
Nous partons ici du principe que le nombre de secondes entre les deux dates a déjà été calculé. Tout ce qu'il nous reste à faire, c'est d'en extraire successivement le nombre d'années, puis de mois, puis de jours... jusqu'à arriver à un nombre de secondes ne dépassant pas la minutes.
On pourrait soustraire au fur et à mesure le nombre de secondes équivalents à une année, puis de mois, puis de semaines... à l'aide de moult boucles while(), mais ce ne serait pas très élégant. Nous allons ici profiter de l'opérateur %, qui nous donne le reste d'une division, ce qui est exactement ce dont nous avons besoin (et nous permet par ailleurs de montrer que % n'est pas qu'utile à découvrir si un nombre est pair ou impair...).

Notez que plus le nombre de secondes est grand, moins le résultat peut être vrai, étant donné que nous utilisons des mois de 30 jours, ce qui implique un décalage...

Le code
<?php
$nbrSecondes = date("U");
// secondes depuis le 01/01/1970

$nbrSecParJour = 3600*24;
$nbrSecParAn = $nbrSecParJour*365.25;
$nbrSecParMois = $nbrSecParJour*30;

$nbrAnnees = floor($nbrSecondes / $nbrSecParAn);
$reste = $nbrSecondes % $nbrSecParAn;

$nbrMois = floor($reste / $nbrSecParMois);
$reste = $reste % $nbrSecParMois;

$nbrSemaines = floor($reste / ($nbrSecParJour*7));
$reste = $reste % ($nbrSecParJour*7);

$nbrJours = floor($reste / $nbrSecParJour);
$reste = $reste % $nbrSecParJour;

$nbrHeures = floor($reste / 3600);
$reste = $reste % 3600;

$nbrMinutes = floor($reste / 60);
$reste = $reste % 60;

echo $nbrSecondes . ' secondes se sont écoulées depuis le 1er Janvier 1970 à minuit, c\'est-à-dire '
. $nbrAnnees . ' année(s), '
. $nbrMois . ' mois, '
. $nbrSemaines . ' semaine(s), '
. $nbrJours . ' jour(s), '
. $nbrHeures . ' heure(s), '
. $nbrMinutes . ' minute(s) et '
. $reste . ' seconde(s).';
?>


 
[ Xavier BorderieJDNet
 
Accueil | Haut de page