Я хочу рассчитать все воскресенье в течение двух дат. Я попробовал следующий код. Он отлично работает, если дни меньше, но если я наберу больше дней. Он продолжает обрабатывать, а максимальное время выполнения превышает меня, изменило время, но даже продолжает обрабатывать даже время выполнения 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; ?>
пожалуйста помоги.
Ответ Джона Конде правильный, но вот более эффективное и матовое решение:
$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 ::) дает нам день 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;
Смотрите это в действии