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 年のバグで、32 ビットの制限によりシステムがその年以降の日付を処理できない y2k のようなものです。代わりに、この問題を回避する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 UTC。

そのため、タイムスタンプを使用してそれ以上の時間を表す/操作することはできません。

于 2012-06-07T02:28:08.450 に答える
1

PHP の日付は、1970 年 1 月 1 日から 2038 年 1 月 19 日までの範囲に制限されています。日付を操作するには、別の方法を使用する必要があります。

PEAR には Date クラスがあります: PEAR Date

于 2012-06-07T02:31:01.360 に答える
0

1980 年から 75 年は 2055 年で、32 ビット整数で表現できる最大の日付値を過ぎています。したがって、結果は 0 になります。これは、観察した 1970 年の日付です。

于 2012-06-07T02:27:00.243 に答える