php程序找到我的生日,其中一天名称"星期一"再过100年

Mad*_*ota 4 php date calculator match

我出生于1986-04-21,也就是星期一.我的下一个生日,日名"星期一"是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";
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

这是该程序的输出:

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
Run Code Online (Sandbox Code Playgroud)

现在我的问题是为什么PHP在1970年之前和2040年之后都没有支持.
那么我怎样才能在2040年之后或1970年之前获得生日呢?

Aln*_*tak 7

根本不需要使用任何特殊的日期处理类或函数.

你的生日是在2月的闰日之后,所以从一年到下一年它将是一天(365%7)或(闰年)两天(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于任何版本的PHP.


Pek*_*ica 5

如果您使用的是PHP 5.3,则可以使用DateTime该类并添加DateIntervals.它基于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
Run Code Online (Sandbox Code Playgroud)

文档就createFromDateString()这里.