Ceci est un problème rencontré très souvent: vouloir comparer deux dates avec la fonction mktime(). On ne pense jamais au souci des heures d'été et d"hiver et on a tendance à faire:
<?php
$fdate = '27/08/2009';
list($d,$m,$y) = explode('/', $fdate);
$first = mktime(0,0,0,$m,$d,$y);
$ldate = date('d/m/Y')
list($ld,$lm,$ly) = explode('/', $ldate);
$last = mktime(0,0,0,$lm,$ld,$ly);
if ($first ==$last) {
echo "C'est le même jour";
}
?>
Ceci marche très bien tant que l'on compare des dates comprises dans le même DST (Daylight Saving Time), c'est à dire si elles sont toutes les deux en heure d'hiver ou d'été. Sinon, on peut avoir un décalage de 600s entre les deux et les dates ne seront pas égales.
Il y a donc trois solutions, de la plus mauvaise à la meilleure (mais ce n'est que mon opinion):
Comparer les chaînes "date"
Si l'on vérifie que les deux dates formatées de la même manière sont égales, il y a de fortes chances pour que le résultat soit juste. Le seul risque est que la comparaison intervienne dans la période de changement.
La vérification serait alors:
if (date('Ymd', $first) == date('Ymd', $last) {
Un autre risque est que vous ne savez pas à quel heure le DST est activé, par exemple les systèmes Solaris l'active à 0h30 alors que les autres systèmes *nix l'activent "à la bonne heure".
Forcer le DST
On oublie trop souvent que mktime peut prendre un septième paramêtre qui est le forçage de l'activation ou la désactivation du DST.
$first = mktime(0,0,0,$m,$d,$y,0);
Il faut donc que les deux mktime() aient le même forçage,
Choisir la bonne heure
Plutôt que de prendre des risques, comparez les dates à midi et non pas minuit.C'est le moyen le plus simple de vous assurer que vous n'êtes pas en plein changement d'horaire.
$first = mktime(12,0,0,$m,$d,$y);