8721 sujets

Développement web côté serveur, CMS

Bonjour,

L'année passée, j'ai créé un calendrier. Celui-ci comprent des fêtes votives calculées en fonction de la fête de Pâques, avec la fonction php easter_date().

Cette année j'ai remarqué des erreurs sur la position des fêtes votives. En faisant des tests voilà ce que j'ai :

echo date("d/m/Y", easter_date(2014) - (20*3600*24) );

Donne : 31/03/2014
echo date("d/m/Y", easter_date(2014) - (21*3600*24) );

Donne : 29/03/2014

Donc, en changeant seulement une seule journée de me retrouve avec un décalage de 2 jours!!!

Avec un nouvel essai :
echo date("d/m/Y", easter_date(2014) - (20.5*3600*24) );

Donne : 30/03/2014 !!!!

Dois-je prendre en compte un décalage horaire ? Et donc ajouter un +2 pour ajouter ou supprimer deux heures ? ou une demi-journée ? Mais dans ce cas là, pourquoi le code est-il correct pour certains jours et pas pour d'autres ?

Merci pour vos réponses éventuelles.
Modifié par Olivier C (15 Mar 2014 - 14:00)
Bonjour Olivier C,

Je n'ai pas testé, mais c'est peut-être la solution :

echo date('d/m/Y', easter_date(2014), strtotime('-20 days') );  // pour retirer 20 jours de la date de Pâques 2014


EDIT: désolé, je viens de tester et je reçois l'avertissement : Warning: Wrong parameter count for date()
Cela est certainement en rapport avec ce qui est dit dans la rubrique "Notes" du fichier "http://www.php.net/manual/en/function.easter-date.php" dont tu parles dans ton post.

EDIT #2 : il est à noter que le passage à l'heure d'été se passe dans la nuit du 29 au 30 mars!
Ceci explique peut-être cela ...
Modifié par lddsoft (15 Mar 2014 - 16:13)
Merci Iddsoft, je ne connaissais pas cette fonction.

Cependant elle ne fonctionne pas telle quelle, et je n'ai pas réussi à l'adapter...

Je suis aussi tombé sur ça. Ce qui confirme un problème de décalage horaire, mais cela n'explique pas tout...

Édit : Il est maintenant 18h00, et avec les même code plus haut je n'ai plus les même problèmes, il s'agit donc vraisemblablement bien d'un problème d'horaire. Il faut je pense que je rajoute des heures, en plus ou en moins...
Modifié par Olivier C (15 Mar 2014 - 18:08)
Modérateur
C'est effectivement le problème, pour y voir plus clair:


echo date("d/m/Y H:i", easter_date(2014) - (20*3600*24) ).'<br>';
// => 31/03/2014 00:00

echo date("d/m/Y H:i", easter_date(2014) - (21*3600*24) ).'<br>';
// => 29/03/2014 23:00

Il n'y a donc pas 2 jours de différence, mais 25 heures…

Tout cela parce que faire des opérations sur des dates à partir de timestamps est une très mauvaise pratique et aboutit à des résultats pouvant contenir plein d'effets de bord. La solution est dans DateTime, et donnée dans la doc de php http://php.net/manual/fr/function.easter-date.php :


function get_easter_datetime($year) {
    $base = new DateTime("$year-03-21");
    $days = easter_days($year);

    return $base->add(new DateInterval("P{$days}D"));
}
$easter = get_easter_datetime(2014);
echo $easter->format("d/m/Y").'<br>';
// => 20/04/2014

$foo = clone $easter;
$bar = clone $easter;

$foo->sub(new DateInterval("P20D"));
echo $foo->format("d/m/Y").'<br>';
// => 31/03/2014

$bar->sub(new DateInterval("P21D"));
echo $bar->format("d/m/Y").'<br>';
// => 30/03/2014