计算两次约会之间的星期天


calculate sundays between two dates

我想计算给定两个日期之间的所有周日。我试着遵循代码。如果天数较少,但如果我输入的天数较多,则效果良好。它保持处理,最长执行时间超过了我更改的时间,但即使执行时间为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;
?>

请帮忙。

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个星期日可以开始,四舍五入到最近的intintval

除此之外,在不到一周的时间内可能会有一个星期天;例如,下一周的星期五至星期一包含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;

在操作中查看

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

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