我想计算给定两个日期之间的所有星期日.我试过以下代码.如果天数较少,但如果我输入更多天,它可以正常工作.它保持处理和最大执行时间超过我改变了时间,但它甚至保持处理甚至执行时间是200秒.
代码是
<?php
$one="2013-01-01";
$two="2013-02-30";
$no=0;
for($i=$one;$i<=$two;$i++)
{
$day=date("N",strtotime($i));
if($day==7)
{
$no++;
}
}
echo $no;
?>
Run Code Online (Sandbox Code Playgroud)
请帮忙.
Qui*_*ahl 27
约翰康德的答案是正确的,但这是一个更有效和肮脏的解决方案:
$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;
Run Code Online (Sandbox Code Playgroud)
让我为你分解一下.
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
Run Code Online (Sandbox Code Playgroud)
首先,创建一些DateTime对象,它们是功能强大的内置PHP对象,用于解决这类问题.
$days = $start->diff($end, true)->days;
Run Code Online (Sandbox Code Playgroud)
接下来,使用的DateTime :: diff的发现从差$start到$end(路过true这里作为第二个参数可以确保该值始终为正),并让他们之间的天数.
$sundays = intval($days / 7) + ($start->format('N') + $days % 7 >= 7);
Run Code Online (Sandbox Code Playgroud)
这是最重要的 - 但它并不是那么复杂,真的.首先,我们知道有一个周日为每星期,所以我们至少$days / 7周日开始说起,向下调整至最接近的int跟intval.
最重要的是,在不到一周的时间内可能会有一个星期天; 例如,下周的周五到周一包含4天; 其中一个是星期天.所以,根据我们开始和结束的时间,可能会有另一个.这很容易解释:
$start->format('N')(参见DateTime :: format)为我们提供了开始日期的一周中的ISO-8601天,这是一个从1到7的数字(1是星期一,7是星期日).$days % 7 给出了剩余天数的数量,这些天数没有平均分为几周.如果我们的开始日和剩余天数加起来达到7天或更多,那么我们就达到了星期天.知道这一点,我们只需添加该表达式,1如果它是真的或者0它是假的,它将给我们,因为我们将它添加到一个int值.
你有它!这种方法的优点是它不需要在给定时间之间每天迭代并检查它是否是星期日,这将为您节省大量计算,并且它还会让您看起来非常聪明.希望有所帮助!
<?php
$no = 0;
$start = new DateTime('2013-01-01');
$end = new DateTime('2013-04-30');
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt)
{
if ($dt->format('N') == 7)
{
$no++;
}
}
echo $no;
Run Code Online (Sandbox Code Playgroud)