par
@rthur » 10 mars 2016, 21:31
Ok, ça me travaillait cette histoire et après quelques recherches, c'est bien un bug connu :
https://bugs.php.net/bug.php?id=52480
La raison est que pour faire son calcul, PHP fait d'abord une conversion des 2 DateTime sur le fuseau horaire GMT
Donc va retirer 1 heure sur la date 2016-03-01 00:00:00 => et donc tomber sur le 29 février 2016 (année bissextile oblige)... ce qui rajoute 1 journée dans l'année, et donc lors de son calcul affiche bien 365 jours de différence entre tes 2 dates mais pour lui vu qu'il y a un 29 février dans l'intervalle, ça ne fait pas 1 année complète mais 11 mois et 30 jours
La solution pour contourner ce comportement inattendu et d'indiquer que tes datetime sont au format UTC et là ça fonctionnera :
<?php
date_default_timezone_set('UTC');
$datetime1 = new DateTime('2017-03-01');
$datetime2 = new DateTime('2016-03-01');
$dateInterval = $datetime2->diff($datetime1);
var_dump($dateInterval);
Au moins, on aura appris quelque chose aujourd'hui !

Ok, ça me travaillait cette histoire et après quelques recherches, c'est bien un bug connu : https://bugs.php.net/bug.php?id=52480
La raison est que pour faire son calcul, PHP fait d'abord une conversion des 2 DateTime sur le fuseau horaire GMT
Donc va retirer 1 heure sur la date 2016-03-01 00:00:00 => et donc tomber sur le 29 février 2016 (année bissextile oblige)... ce qui rajoute 1 journée dans l'année, et donc lors de son calcul affiche bien 365 jours de différence entre tes 2 dates mais pour lui vu qu'il y a un 29 février dans l'intervalle, ça ne fait pas 1 année complète mais 11 mois et 30 jours ;-)
La solution pour contourner ce comportement inattendu et d'indiquer que tes datetime sont au format UTC et là ça fonctionnera :
[php]<?php
date_default_timezone_set('UTC');
$datetime1 = new DateTime('2017-03-01');
$datetime2 = new DateTime('2016-03-01');
$dateInterval = $datetime2->diff($datetime1);
var_dump($dateInterval);[/php]
Au moins, on aura appris quelque chose aujourd'hui ! :)