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 日是星期六

1/26/1406是星期二

1/26/1756确实是星期一

这里发生了什么?

4

1 回答 1

3

strtotime()将日期的字符串表示形式转换为 unix 时间戳 - 自 1970 年 1 月 1 日以来的秒数。您可能会在这里开始看到问题...

时间戳通常存储在 32 位整数中,其范围在 1970 到 2038 之间。尝试为超出该范围的日期生成时间戳会给您带来不确定的行为。

- 编辑 -

从 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 回答