约翰康德的答案是正确的,但这是一个更有效和肮脏的解决方案:
$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查找从$start到$end的差异(在此处传递true,因为第二个参数确保此值始终为正),并获取它们之间的天数.
$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);
这是最重要的 – 但它并不是那么复杂,真的.首先,我们知道每周有一个星期天,所以我们至少有$days / 7个星期日开始,用intval向下舍入到最近的int.
最重要的是,在不到一周的时间内可能会有一个星期天;例如,下周的周五到周一包含4天;其中一个是星期天.所以,根据我们开始和结束的时间,可能会有另一个.这很容易解释:
> $start->格式(‘N’)(参见DateTime::format)为我们提供了开始日期的一周中的ISO-8601天,这是一个从1到7的数字(1是星期一,7是星期日).
> $days%7为我们提供了剩余天数,这些天数没有平均分为几周.
如果我们的开始日和剩余天数加起来达到7天或更多,那么我们就达到了星期天.知道这一点,我们只需添加该表达式,如果它是真的则给出1,如果它是假的则给出0,因为我们将它添加到int值.
你有它!这种方法的优点是它不需要在给定时间之间每天迭代并检查它是否是星期日,这将为您节省大量计算,并且它还会让您看起来非常聪明.希望有所帮助!