Intereting Posts
Как изменить массив в PHP? ошибка при загрузке строки со специальными символами RESTful загрузка файла в PHP PHP / Sphinxsearch – поиск строки или lat lng PHP: обмен статической переменной между потоками Как увидеть расширения, загруженные PHP? Получение ошибки при попытке инициализации этой публичной переменной класса с использованием dirname () вне метода помощь по созданию базовой поисковой системы php Существуют ли ограничения для переменных сеанса? как загрузить файл изображения из каталога документов на php-сервер в iphone Команды не синхронизированы; вы не можете запустить эту команду сейчас, когда вызываете хранимую процедуру в Mysql Перенаправление PHP после завершения формы Laravel Недопустимый оператор и комбинация значений Exception on with () с отношением ownTo () PHP – exec () vs system () vs passthru () Как создать объект Crypt :: RSA из модуля, экспоненты и частного экспонента?

рассчитать воскресенье между двумя датами

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

Смотрите это в действии