如何解决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,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(例如
视窗)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。