【问题标题】:Adding years to a date resets to 1970-01-01将年份添加到日期重置为 1970-01-01
【发布时间】:2012-06-07 02:24:21
【问题描述】:
$somedate = "1980-02-15";
$otherdate = strtotime('+1 year', strtotime($somedate));
echo date('Y-m-d', $otherdate);

输出

1981-02-15

$somedate = "1980-02-15";
$otherdate = strtotime('+2 year', strtotime($somedate));
echo date('Y-m-d', $otherdate); 

输出

1982-02-15

但是

$somedate = "1980-02-15";
$otherdate = strtotime('+75 year', strtotime($somedate));
echo date('Y-m-d', $otherdate); 

输出

1970-01-01

如何解决?

【问题讨论】:

    标签: php date strtotime dateadd


    【解决方案1】:

    2038 bug 类似于 y2k,由于 32 位限制,系统无法处理该年之后的日期。请改用DateTime class 来解决此问题。

    适用于 PHP 5.3+

    $date = new DateTime('1980-02-15');
    $date->add(new DateInterval('P75Y'));
    echo $date->format('Y-m-d');
    

    适用于 PHP 5.2

    $date = new DateTime('1980-02-15');
    $date->modify('+75 year');
    echo $date->format('Y-m-d');
    

    【讨论】:

    • 如何使用 datetime 类将 75 年添加到给定的“1980-02-15”字符串?
    • 谢谢。我收到致命错误:调用未定义的函数 date_add()。我正在使用 PHP 版本 5.2.17。
    • 啊。这需要 5.3。让我看看我能不能找到一个 5.2 的例子。
    • 好的,找到 PHP 5.2 的替代品
    【解决方案2】:

    strtotime() 使用 unix 时间戳,因此如果它尝试计算 2038 年之后的年份并返回到 1970 年,则会溢出。

    要解决此问题,请使用 DateTime 对象。 http://php.net/manual/en/book.datetime.php

    要向 DateTime 对象添加一段时间,请使用 DateTime::add,它将 DateInterval 作为参数。 http://php.net/manual/en/datetime.add.php http://www.php.net/manual/en/class.dateinterval.php

    $date = new DateTime("1980-02-15");
    if (method_exists("DateTime", "add")) {
        $date->add(new DateInterval("Y75"));
    } else {
        $date->modify("+75 years");
    }
    echo $date->format("Y-m-d");
    

    【讨论】:

    • 如何使用 datetime 类将 75 年添加到给定的“1980-02-15”字符串?
    • 谢谢。我收到致命错误:调用未定义的方法 DateTime::add()。我正在使用 PHP 版本 5.2.17。
    • ::add 仅在 5.3+ 中。您需要使用与 strtotime 类似的字符串参数调用 ::modify。
    【解决方案3】:

    对于 unix 时间戳,最大可表示时间为 2038-01-19。世界标准时间 03:14:07。

    所以你不能用时间戳来表示/操作它上面的时间。

    【讨论】:

      【解决方案4】:

      PHP 的日期限制在 01-01-1970 到 19-01-2038 的范围内。您将不得不使用不同的方法来处理日期。

      PEAR 有一个 Date 类:PEAR Date

      【讨论】:

        【解决方案5】:

        从 1980 年开始的 75 年是 2055,它超过了可以用 32 位整数表示的最高日期值。因此结果变为 0,即您观察到的 1970 年日期。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-17
          • 2011-09-09
          相关资源
          最近更新 更多