我想计算给定两个日期之间的所有周日。我试着遵循代码。如果天数较少,但如果我输入的天数较多,则效果良好。它保持处理,最长执行时间超过了我更改的时间,但即使执行时间为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
个星期日可以开始,四舍五入到最近的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;
在操作中查看
如果您希望周日在特定日期范围内,这里有一个解决方案。
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