约翰康德的回答是正确的,但这里有一个更有效和数学的解决方案:
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;
$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);
echo $sundays;
让我为你分解一下。
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
首先,创建一些DateTime对象,它们是功能强大的内置 PHP 对象,专门用于解决此类问题。
$days = $start->diff($end, true)->days;
接下来,使用DateTime::diff求出 from $start
to的差异$end
(此处作为第二个参数传递true
可确保该值始终为正),并获取它们之间的天数。
$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);
大的来了——但它并没有那么复杂,真的。首先,我们知道每个星期都有一个星期日,所以我们至少有$days / 7
星期日开始,用 向下舍入到最接近int
的值intval
。
最重要的是,在不到一周的时间内可能会有一个星期天;例如,周五到下周的周一包含 4 天;其中之一是星期天。所以,根据我们开始和结束的时间,可能会有另一个。这很容易解释:
$start->format('N')
(参见DateTime::format)为我们提供了ISO-8601星期几作为开始日期,它是一个从 1 到 7 的数字(1 是星期一,7 是星期日)。
$days % 7
给我们剩余的天数,这些天数没有均匀地划分为几周。
如果我们的开始日和剩余天数加起来是 7 天或更多,那么我们就到了星期天。知道了这一点,我们只需要添加那个表达式,它会告诉我们1
它是真还是0
假,因为我们将它添加到一个int
值中。
你有它!这种方法的优点是它不需要在给定时间之间每天迭代并检查是否是星期天,这将为您节省大量计算量,而且它会让您看起来非常聪明。希望有帮助!