我一直在帮助某人调试一些代码,其中错误消息是“Day too big”.我知道这源于当地时间和Y2038错误(大多数谷歌搜索结果似乎是人们处理将来到期的cookie).
我们似乎通过使用时间来获取当前日期来“解决”问题.但是,鉴于我们的原始日期都没有达到2038年的问题,我怀疑我们是否已经解决了这个问题……
还有其他情况,任何人都知道一个人会在哪里打“天太大”?
操作系统是Solaris.
示例代码 – 实际代码非常大,我正在使用的人实际上没有隔离有问题的部分(这就是为什么我担心’修复’实际上不是一个修复).如果我能把一些简洁的东西放在一起再现这个问题,我会发布!
UPDATE
我分离了一些代码,在所有内容周围放置了一些打印语句并解决了问题…
令人讨厌的代码行是:
$temp = str2time(localtime());
这通常(但不总是)将$temp设置为undef.事实证明,即使设置了$temp,也没有设置预期值.
问题是localtime()在大多数情况下返回一个数组……这就是搞乱str2time的调用.
通过将其更改为:
$ltime = localtime; $temp = str2time($ltime);
问题消失了.
当然,更好的是,只需使用:
$temp = time;
解决方法
Time :: Local包中有一个“Day too big”消息.如果您想进一步调查,源代码是
here.
Carp::Always
模块在这里可能会有所帮助.运行违规代码
perl -MCarp::Always script.pl arg1 arg2 ...
无论你以前在哪里得到警告,你现在都可以获得完整的堆栈跟踪.