问题 19:
您将获得以下信息,但您可能更愿意自己做一些研究。
1900 年 1 月 1 日是星期一。
三十天有九月、四月、六月和十一月。
其余的都有三十一个,仅保存二月,它有二十八,风雨无阻。在闰年,二十九。
闰年出现在任何能被 4 整除的年份,但不会出现在世纪,除非它能被 400 整除。
在 20 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日)有多少个星期日是每月的第一天?
我认为使用 PHP 会轻而易举,因为它有很多内置的时间和日期函数。我的代码真的很简单,所以我很难看出我在做什么是错的。
我的代码:
<?php
echo "<pre>";
$sunday_count = 0;
for( $year = 1901; $year <= 2000; $year++ ) {
for( $month = 1; $month <= 12; $month++ ) {
// Produces a date in format: 1/1/2000
$date = $month . "/1/" . $year;
$time = strtotime( $date );
$is_sunday = ( date( 'l', $time ) == "Sunday" );
echo "$date "
. ( $is_sunday ? 'was a Sunday. ' : '' )
. "<br>";
if( $is_sunday ) $sunday_count++;
}
}
echo "Answer: $sunday_count";
echo "</pre>";
?>
我的代码提出的解决方案是 169,这是不正确的。任何的想法?
编辑 1
解应该是 171。
使用 Wolfram Alpha 和我的 Windows 时钟,我双重检查了我的代码报告的几个星期天。他们都检查好了。
所以看起来我的代码报告了有效和合法的星期天,但不知何故它错过了其中两个。
编辑 2
我对代码中日期的格式进行了以下细微更改:
$date = sprintf('%d-%02d-01', $year, $month); // formats yyyy-mm-dd
然后我使用@MadaraUchiha 的代码生成一个包含 171 个正确日期的数组。
在将他的日期与我的日期进行比较后,这是两个错过的日期:
1901-09-01 1901-12-01
编辑 3
键盘还显示这些日期不是星期日(但它们确实应该是)。
而且我确信这些日期被正确解释为 YYYY-MM-DD,因为我的代码为解决方案提供的日期之一是 2000-10-01,如果 10 是月份而不是日期,那么它只会是星期日.
编辑 4
显然,如果在 32 位系统上,Unix 时间戳将无法在该范围之外工作:
Fri, 13 Dec 1901 20:45:54 GMT
到
Tue, 19 Jan 2038 03:14:07 GMT