代码之家  ›  专栏  ›  技术社区  ›  azp74

为什么Perl会出现“day too big”错误?

  •  3
  • azp74  · 技术社区  · 16 年前

    我一直在帮助别人调试一些错误信息为“day too big”的代码。我知道这源于localtime和2003年的bug(大多数google结果似乎是处理过期的cookie的人)。

    我们似乎已经通过使用时间获取当前日期来“修复”了该问题。然而,考虑到我们最初的日期都不应该触及2038年的问题,我怀疑我们是否真的解决了这个问题…

    有没有其他的例子,谁知道一个人会打“天太大”?

    操作系统是solaris。

    示例代码-实际代码非常大,我正在工作的人实际上没有隔离出有问题的部分(这就是为什么我担心“修复”实际上不是修复)。如果我能把一些简洁的东西复制出来,我会张贴!

    更新

    我隔离了这段代码,在每件事情周围放了一些打印语句,解决了这个问题…

    违规代码行是:

    $temp = str2time(localtime());
    

    这通常(但并不总是)将$temp设置为undef。结果发现,即使设置了$temp,也没有设置预期值。

    问题是localtime()在大多数上下文中返回数组…而这正是打乱第二次标准时间会议的原因。

    更改为:

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

    问题解决了。

    当然,更好的方法是,使用:

    $temp = time;
    
    1 回复  |  直到 16 年前
        1
  •  7
  •   mob    16 年前

    有一条“天太大”的信息来自 Time::Local 包裹。源代码是 here 如果你想进一步调查。

    这个 Carp::Always 模块在这里可能会有帮助。运行有问题的代码

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

    无论你在哪里得到警告,你现在都会得到一个完整的堆栈跟踪。