php程序在另外100年中找到我的生日,其中的天名“ Monday”

| 我出生于1986-04-21,即星期一。我的下一个生日叫“ Monday”,日期是1997-04-21,依此类推。 我编写了该程序以查找长达100年的时间,以查找我的生日中哪一天与星期一匹配的日期名称。 这是代码:
<?php
date_default_timezone_set(\'Asia/Calcutta\');
for($year = 1986; $year < 2086; $year++) {
    $timestamp = mktime(0, 0, 0, 4, 21, $year);
    if(date(\'l\', $timestamp) == \'Monday\') {
        echo date(\'Y-m-d, l\', $timestamp) . \"\\n\";
    }
}
?>
这是程序的输出:
1986-04-21, Monday
1997-04-21, Monday
2003-04-21, Monday
2008-04-21, Monday
2014-04-21, Monday
2025-04-21, Monday
2031-04-21, Monday
2036-04-21, Monday
现在我的问题是为什么PHP在1970年之前和2040年之后不支持。  那么,如何在2040年之后或1970年之前获得生日?     
已邀请:
        根本不需要使用任何特殊的日期处理类或函数。 您的生日是在2月的leap日之后,所以从一年到下一年,它会比原日期晚一天(365%7)或(leap年)两天(366%7)前一年。
$year = 1985; // start year
$dow = 0;     // 0 for 1985-04-21 (Sunday)

while ($year < 2100) {

    $year++; $dow++;

    if ($year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)) {
       $dow++; // leap year
    }

    $dow %= 7;      // normalise back to Sunday -> Saturday
    if ($dow == 1) {
        printf(\"%04d-%02d-%02d is a Monday\\n\", $year, 4, 21);
    }
}
此代码可在任何版本的PHP上使用。     
        如果您使用的是PHP 5.3,则可以使用
DateTime
类并添加
DateInterval
s。它基于64位整数,并且没有2038年的问题。 基本示例:
<?php

$year = DateInterval::createFromDateString(\'1 year\'); 

$date = new DateTime(\'1986-04-21\');
$date->add($year);
echo $date->format(\'Y-m-d\') . \"\\n\";  // Repeat 100 times
createFromDateString()
的文档在这里。     
        鉴于您为什么不能在1970年之前或2038年以后去,请参阅日期手册:   时间戳记的有效范围是   通常从1901年12月13日星期五开始   GMT到2038年1月19日星期二20:45:54   格林尼治标准时间03:14:07。 (这些是日期   对应于最小值和   32位带符号的最大值   整数)。但是,在PHP 5.1.0之前   此范围仅限1970年1月1日   在某些系统上为19-01-2038(例如   视窗)。     

要回复问题请先登录注册