3
$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

怎么修?

4

5 回答 5

5

这是2038 错误,类似于 y2k,由于 32 位限制,系统无法处理该年之后的日期。请改用DateTime 类,它可以解决此问题。

对于 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');
于 2012-06-07T02:27:33.717 回答
3

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");
于 2012-06-07T02:27:56.590 回答
1

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

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

于 2012-06-07T02:28:08.450 回答
1

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

PEAR 有一个 Date 类:PEAR Date

于 2012-06-07T02:31:01.360 回答
0

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

于 2012-06-07T02:27:00.243 回答