计算两个日期之间的星期日

Dam*_*kha 5 php time

我想计算给定两个日期之间的所有星期日.我试过以下代码.如果天数较少,但如果我输入更多天,它可以正常工作.它保持处理和最大执行时间超过我改变了时间,但它甚至保持处理甚至执行时间是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周日开始说起,向下调整至最接近的intintval.

最重要的是,在不到一周的时间内可能会有一个星期天; 例如,下周的周五到周一包含4天; 其中一个是星期天.所以,根据我们开始和结束的时间,可能会有另一个.这很容易解释:

  • $start->format('N')(参见DateTime :: format)为我们提供了开始日期的一周中的ISO-8601天,这是一个从1到7的数字(1是星期一,7是星期日).
  • $days % 7 给出了剩余天数的数量,这些天数没有平均分为几周.

如果我们的开始日和剩余天数加起来达到7天或更多,那么我们就达到了星期天.知道这一点,我们只需添加该表达式,1如果它是真的或者0它是假的,它将给我们,因为我们将它添加到一个int值.

你有它!这种方法的优点是它不需要在给定时间之间每天迭代并检查它是否是星期日,这将为您节省大量计算,并且它还会让您看起来非常聪明.希望有所帮助!

  • 嗨,谢谢你的解决方案.如果我想知道有多少个星期一那么你可以做什么,你可以让它充满活力. (4认同)
  • 这部分不是真的`因为$ days和7都是int值,所以它总是向下舍入到最近的int`.你必须使用像[floor()]这样的圆形函数(http://www.php.net/manual/en/function.floor.php)来围绕它,PHP不会为你做,试试这个例子`$ end = new DateTime('2013-02-20');`输出为十进制. (2认同)
  • 你说得对,哎呀!忘了我说的是PHP一秒钟. (2认同)
  • @Er.KT 该算法适用于除最后一部分之外的任何一天:“如果我们的起始日和剩余天数加起来为 7 或更多,那么我们就到达了星期日。”您应该只需要更改此表达式: `$start-&gt;format('N') + $days % 7 &gt;= 7` 类似于 `$start-&gt;format('N') + $days % 7 &gt;= $ISO8601NumberForDesiredDayOfWeek`。如上所述,ISO-8601 表示一周中某一天的数字是 1 到 7 之间的数字,其中星期一为 1,星期日为 7。 (2认同)

Joh*_*nde 8

<?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)

看到它在行动