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年之前获得生日呢?
根本不需要使用任何特殊的日期处理类或函数.
你的生日是在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.
如果您使用的是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()在这里.