0

まず、私のコードは次のとおりです。

<?php
$year = 1006;
while ($year <= 1996)
{
    $date = '1/26/' . $year;
    if (date('l', strtotime($date)) == 'Monday')
    {
        echo $date . PHP_EOL;
    }

    $year += 10;
}
?>

これは、1000 年から 1999 年までの 1 月 26 日を出力することになっています。年は 6 で終わり、日付は月曜日になります。出力は次のとおりです。

1/26/1006
1/26/1096
1/26/1136
1/26/1186
1/26/1226
1/26/1316
1/26/1366
1/26/1406
1/26/1496
1/26/1536
1/26/1586
1/26/1626
1/26/1756
1/26/1846
1/26/1976

すべてが順調に見えます。しかし、timeanddate.com でこれらの年のいくつかを見ると、平日に共通点はないようです。

1006年 1 月 26 日は土曜日です

1406年 1 月 26 日は火曜日

1756年 1 月 26 日は月曜日になります

何が起きてる?

4

1 に答える 1

3

strtotime()は、日付の文字列表現を UNIX タイムスタンプ (1970 年 1 月 1 日からの秒数) に変換します。ここで問題が発生する可能性があります...

タイムスタンプは通常、1970 ~ 2038 の範囲の 32 ビット整数で格納されます。その範囲外の日付のタイムスタンプを生成しようとすると、未定義の動作が発生します。

- 編集 -

PHPマニュアルから:

タイムスタンプの有効な範囲は通常、1901 年 12 月 13 日金曜日 20:45:54 GMT から 2038 年 1 月 19 日火曜日 03:14:07 GMT までです。(これらは、32 ビット符号付き整数の最小値と最大値に対応する日付です)。ただし、PHP 5.1.0 より前は、一部のシステム (Windows など) では、この範囲が 01-01-1970 から 19-01-2038 に制限されていました。

于 2013-04-23T16:19:04.790 に答える