5

我想计算给定两个日期之间的所有星期日。我尝试了以下代码。如果天数较少但如果我输入更多天数,它工作正常。它继续处理并且最大执行时间超过了我更改的时间,但它甚至继续处理,即使执行时间为 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;

?>

请帮忙。

4

3 回答 3

30

约翰康德的回答是正确的,但这里有一个更有效和数学的解决方案:

$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 $startto的差异$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值中。

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

于 2013-04-08T19:16:50.693 回答
10
<?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;

看到它在行动

于 2013-04-08T18:26:16.950 回答
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
于 2018-03-08T09:51:11.723 回答