【问题标题】:PHP - why is this date function not erroring outPHP - 为什么这个日期函数没有出错
【发布时间】:2010-04-20 19:10:38
【问题描述】:
function convertDT($TS) {
    $TS = strtotime($TS);
    $TS -= date("Z");
    $newTS = date("Y-m-d\TH:i:s\Z", $TS);
    return $newTS;
}

echo "Good: ".convertDT('2010-04-20 01:23:45')."\n";
echo "Bad: ".convertDT('2010-31-20 01:23:45')."\n";

第二个日期返回:1969-12-31T23:00:00Z

为什么?应该是这个错误吗?

【问题讨论】:

    标签: php date format utc


    【解决方案1】:

    strtotime() 当你给它一个无效的时间戳时返回falsefalse 等效于 0 如果你在整数上下文中使用它,所以当你将它传递给这一行时:

    $newTS = date("Y-m-d\TH:i:s\Z", $TS);
    

    您实际上是根据0 的时间戳创建日期。就 UNIX 纪元而言,0 是 1970 年 1 月 1 日,这是您获得最终结果的地方。

    你最好的选择是这样的:

    $TS = strtotime($TS);
    if($TS === false) {
        throw new Exception("Invalid timestamp.");
    }
    //etc.
    

    【讨论】:

    • 谢谢,这就是我要找的
    【解决方案2】:

    在您的第二个日期,您尝试创建一个日期为第 31 个月和第 20 天。即使您颠倒了这些日期,也没有任何意义。可能是笔误。

    【讨论】:

    • 是的,我想验证并抛出错误,而不是返回 1969 年的日期
    • @Phill: strtotime 出错了,因为你给了它一个虚假的日期。您可以检查它是否在错误时返回 FALSE。在示例的第二行中,您基本上每次都在执行 0 - date('Z'),因为 FALSE 被强制转换为 0。
    【解决方案3】:

    阅读此http://php.net/manual/en/function.strtotime.php

    错误/异常

    每次调用日期/时间函数 如果时间会生成一个 E_NOTICE 区域无效,和/或 E_STRICT 或 E_WARNING 消息,如果使用 系统设置或 TZ 环境 多变的。也可以看看 date_default_timezone_set()

    即使输入的字符串无效,该函数也不会产生任何错误。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2011-01-06
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多