3 votes

Pourquoi est-ce que je reçois une erreur "Jour trop grand" de Perl ?

J'ai aidé quelqu'un à déboguer du code où le message d'erreur était "Jour trop grand". Je sais que cela provient de localtime et du bug Y2038 (la plupart des résultats de recherche sur Google semblent être des gens confrontés à des cookies expirants bien dans le futur).

Il semble que nous ayons 'réglé' le problème en utilisant time pour obtenir la date actuelle. Cependant, étant donné que aucune de nos dates d'origine ne devrait avoir atteint le problème de 2038, je suis sceptique quant au fait que nous ayons réellement résolu le problème...

Y a-t-il d'autres cas que quelqu'un connaît où l'on pourrait rencontrer "jour trop grand" ?

OS est Solaris.

Code d'exemple - le code réel est assez long et la personne avec qui je travaille n'a pas réellement isolé la partie incriminée (c'est pourquoi je crains que le 'correctif' ne soit pas vraiment un correctif). Si je peux compiler quelque chose de concis qui reproduit le problème, je le posterai !

MISE À JOUR

J'ai isolé le bout de code, mis des déclarations d'impression partout et ai résolu le problème...

La ligne de code incriminée était :

$temp = strtotime(localtime());

Cela définissait souvent (mais pas toujours) $temp comme non défini. Il s'avère que même lorsque $temp était défini, il ne l'était pas avec la valeur attendue.

Le hic est que localtime() retourne un tableau dans la plupart des contextes ... et c'est ce qui perturbe l'appel à strtotime.

En changeant cela en :

$ltime = localtime;
$temp = strtotime($ltime);

le problème disparaît.

Bien sûr, encore mieux, il suffit d'utiliser :

$temp = time;

7voto

mob Points 61524

Il y a un message "Jour trop grand" du package Time::Local. Le code source se trouve ici si vous souhaitez enquêter plus en détail.

Le module Carp::Always pourrait être utile ici. Exécutez le code fautif avec

perl -MCarp::Always script.pl arg1 arg2 ...

et partout où vous aviez auparavant un avertissement, vous obtiendrez désormais une trace complète de la pile.

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