Я хочу узнать количество выходных и количество рабочих дней только по знакомым $startDate
а также $endDate
Есть ли какая-либо функция PHP, которая может рассчитывать автоматически?
Это мой код:
$endDate = strtotime($endDate);
$startDate = strtotime($startDate);
echo $days = ($endDate - $startDate) / 86400 + 1;
Мой код вернет, сколько дней, и как мне нужно больше, это какой день?
Как я могу получить это?
Пример:
startDate:`2014-11-17`
endDate:`2014-11-19`
Я хочу этот вывод:
it's 3 day
2014-11-17 is Monday
2014-11-18 is Tueday
2014-11-19 is Wendnesday
Как насчет…
for ($time = $startDate; $time <= $endDate; $time += 86400) {
echo date('Y-m-d \i\s l', $time) . '<br>';
}
Это может помочь вам, или, по крайней мере, может дать вам некоторую подсказку
$endDate = strtotime($endDate);
$startDate = strtotime($startDate);
echo $days = ($endDate - $startDate) / 86400 + 1;
$time = $startDate;
while ($time <= $endDate) {
echo date('Y-m-d', $time) . ' is ' . date('l', $time);
$time += 86400;
}
if ($time != $endDate) {
echo date('Y-m-d', $time) . ' is ' . date('l', $time);
}
Это должно работать для вас:
<?php
$startDate = strtotime("2014-11-17");
$endDate = strtotime("2014-11-19");
echo "It's " . $days = ($endDate - $startDate) / 86400 + 1 . " days";
for($count = 0; $count < $days; $count++)
echo "<br />" . date('Y-m-d', strtotime('+' . $count . ' day', $startDate)) . ' is ' . date('l', strtotime('+' . $count . ' day', $startDate));
?>
Выход:
It's 3 days
2014-11-17 is Monday
2014-11-18 is Tuesday
2014-11-19 is Wednesday
Там нет встроенного. В Excel есть NETWORKDAYS (), но в PHP вы должны свернуть свои собственные.
Есть решение PHP на Разница в день без выходных
Обратите внимание на его ограничения в комментариях, например. если праздничный день выпадает на выходной день.
На следующей странице описывается альтернативная реализация NETWORKDAYS (): http://www.cpearson.com/excel/betternetworkdays.aspx
Это не PHP, но это демонстрирует логику.
К сожалению, нет другого пути, кроме циклического прохождения каждого дня в периоде и принятия решения о том, стоит ли считать его. Вам необходимо принять аргументы для (или жестко заданного кода) выходных дней и дат любых государственных праздников (если вы исключаете праздничные дни).
Если вы делаете это часто и в течение длительных периодов, вы можете предварительно рассчитать и кэшировать количество рабочих дней для каждого календарного месяца и года; затем во время выполнения вы просматриваете количество дней в каждом целом году в течение периода, затем оставшиеся целые месяцы, а затем выполняете обычный цикл для оставшихся дней в начале и в конце периода.
РЕДАКТИРОВАТЬ: Если вы просто хотите исключить выходные (не праздничные дни), то вы можете рассчитать 5 дней для каждой целой недели в периоде, а затем рассчитать оставшиеся дни: https://github.com/bgarlock/scripts/blob/master/PHP%20Equivalent%20of%20MS%20Excel%20NETWORKDAYS%20function.php
Пожалуйста, найдите ниже код, я уверен, что это работает для вас
ПРИМЕЧАНИЕ. Переданный параметр P1D обозначает разницу в 1 день, также как вы можете передать P1M за 1 месяц, P1W за 1 неделю и P1Y за 1 год.
$date1 = '29/08/2013';
$date2 = '03/09/2013';
function returnDates($fromdate, $todate) {
$fromdate = \DateTime::createFromFormat('d/m/Y', $fromdate);
$todate = \DateTime::createFromFormat('d/m/Y', $todate);
return new \DatePeriod(
$fromdate,
new \DateInterval('P1D'),
$todate->modify('+1 day')
);
}
$datePeriod = returnDates($date1, $date2);
foreach($datePeriod as $date) {
echo $date->format('d/m/Y'), PHP_EOL; //you can set any date format here
}