为什么我从Perl那里得到"Day too big"错误?

azp*_*p74 3 perl date

我一直在帮助某人调试一些代码,其中错误消息是"Day too big".我知道这源于当地时间和Y2038错误(大多数谷歌搜索结果似乎是人们处理将来到期的cookie).

我们似乎通过使用时间来获取当前日期来"解决"问题.但是,鉴于我们的原始日期都没有达到2038年的问题,我怀疑我们实际上已经解决了这个问题......

还有其他情况,任何人都知道一个人会在哪里打"天太大"?

操作系统是Solaris.

示例代码 - 实际代码非常大,我正在使用的人实际上没有隔离有问题的部分(这就是为什么我担心'修复'实际上不是一个修复).如果我能把一些简洁的东西放在一起再现这个问题,我会发布!

UPDATE

我分离了一些代码,在所有内容周围放置了一些打印语句并解决了问题...

令人讨厌的代码行是:

$temp = str2time(localtime());
Run Code Online (Sandbox Code Playgroud)

这通常(但不总是)将$ temp设置为undef.事实证明,即使设置了$ temp,也没有设置预期值.

问题是localtime()在大多数情况下返回一个数组......这就是搞乱str2time的调用.

通过将其更改为:

$ltime = localtime;
$temp = str2time($ltime);
Run Code Online (Sandbox Code Playgroud)

问题消失了.

当然,更好的是,只需使用:

$temp = time;
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 7

包中有一个"Day too big"的消息Time::Local.如果您想进一步调查,源代码就在这里.

Carp::Always模块在这里可能会有所帮助.运行违规代码

perl -MCarp::Always script.pl arg1 arg2 ...
Run Code Online (Sandbox Code Playgroud)

无论你以前在哪里得到警告,你现在都可以获得完整的堆栈跟踪.