2 votes

Le calculateur de date PHP renvoie des jours erronés

J'utilise la calculatrice ci-dessous pour déterminer les années, les mois et les jours entre une date donnée et la date du jour. Je pensais qu'elle fonctionnait bien, mais j'ai remarqué qu'elle ne fonctionnait pas correctement au moment du passage à l'année suivante. Demain est en fait la date à laquelle la marque d'un an serait, mais il est actuellement retourner 11 months, 34 days . Quelqu'un peut-il me dire ce qui ne va pas ? Cela devrait être 11 months, 30 days .

function relationshipTimer($functionDate)
{
    $date1 = $functionDate;
    $date2 = date("Y-m-d");
    $diff = abs(strtotime($date2) - strtotime($date1));
    $years = floor($diff / (365 * 60 * 60 * 24));
    $months = floor(($diff - ($years * 365 * 60 * 60 * 24)) / ((365 * 60 * 60 * 24) / 12));
    $days = floor(($diff - $years * 365 * 60 * 60 * 24 - $months * 30 * 60 * 60 * 24) / (60 * 60 * 24));
    if ($years > 0) {echo $years . " Year";}
    if ($years > 1) {echo "s ";}
    if ($months > 0) {echo " " . $months . " Month";}
    if ($months > 1) {echo "s ";}
    if ($date1 == $date2) {echo "1 Day ";}
    if ($days > 0) {echo $days . " Day";}
    if ($days > 1) {echo "s ";}
}

Et c'est de là que vient $functionDate :

relationshipTimer("2018-04-28");

5voto

xhienne Points 2270

Lorsque vous calculez $days vous partez du principe que tous les mois ont une durée de 30 jours, ce qui est évidemment faux. Vous obtenez donc une année de 11 mois plus 35 jours (36 jours pour les années bissextiles).

Le traitement des dates est compliqué. Vous devez toujours utiliser des outils spécialisés tels que l'outil PHP DateTime::diff()

Par exemple, avec :

$date1 = new DateTime("2018-04-28");
$date2 = new DateTime("2019-04-27");
$diff = $date2->diff($date1);
print $diff->format("%y years %m months %d days\n");

... vous obtenez (parce que le mois d'avril compte 30 jours) :

0 years 11 months 29 days

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X