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

时间:2013-04-08 18:21:20

标签: 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;

?>

请帮忙。

3 个答案:

答案 0 :(得分:27)

John Conde的回答是正确的,但这是一个更有效和更妥协的解决方案:

$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个星期日开始,用int向下舍入到最近的intval

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

  • $start->format('N')(请参阅DateTime::format)为我们提供了开始日期的 ISO-8601 日,即1到7之间的数字(1是星期一,7是星期日)。
  • $days % 7为我们提供了剩余天数,这些天没有平均分为几周。

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

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

答案 1 :(得分: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;

See it in action

答案 2 :(得分:1)

如果您希望星期日在特定日期范围内,这是一个解决方案。

function dateRange($begin, $end, $interval = null)
{
  $begin = new DateTime($begin);
  $end = new DateTime($end);

  $end = $end->modify('+1 day');
  $interval = new DateInterval($interval ? $interval : 'P1D');

  return iterator_to_array(new DatePeriod($begin, $interval, $end));
}

/* define date range */
$dates = dateRange('2018-03-01', '2018-03-31');

/* define weekdays */
$weekends = array_filter($dates, function ($date) {
  $day = $date->format("N");
  return $day === '6' || $day === '7';
});

/* weekdays output */
foreach ($weekends as $date) {
  echo $date->format("D Y-m-d") . "</br>";
}

/* define sundays */
$sundays = array_filter($dates, function ($date) {
  return $date->format("N") === '7';
});

/* sundays output */
foreach ($sundays as $date) {
echo $date->format("D Y-m-d") . "</br>";
}

/* define mondays */
$mondays = array_filter($dates, function ($date) {
 return $date->format("N") === '1';
});

/* mondays output */
foreach ($mondays as $date) {
echo $date->format("D Y-m-d") . "</br>";
}

只需更改输出中所需日期的数字:

Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
Sunday = 7