예를 들어, 오늘이 월요일 (2025-05-26)이라고 가정하고 3 일의 근무일을 빼고 싶다고 가정합니다. 직접 사용하는 경우 :
$date = new DateTime('2025-05-26');
$date->sub(new DateInterval('P3D')); // 마이너스3하늘
echo $date->format('Y-m-d');
결과는 2025-05-23 (금요일)이며 정확한 것으로 보입니다. 그러나 시작 날짜가 월요일이고 빼기 근무일이 크면 토요일과 일요일이 포함되며 계산 결과가 벗어날 것입니다.
주기 감소 일 : 매일 감소의 경우 먼저 하루가 주말 (토요일 또는 일요일)인지 결정하십시오.
주말 건너 뛰기 : 하루가 주말이라면 감소는 평일 감소에 의존하지 않습니다.
요구 사항을 충족하기 위해 근무일 수를 계속 줄입니다 .
아래는 지정된 날짜 로 시작하여 지정된 근무일 수를 빼고 주말을 건너 뜁니다.
function subtractWorkingDays(DateTime $date, int $days): DateTime {
$result = clone $date; // 복제는 원래 객체를 수정하지 않습니다
while ($days > 0) {
$result->sub(new DateInterval('P1D')); // 每次减少一하늘
$weekday = (int)$result->format('N'); // 1 (월요일에) 도착하다 7 (일요일)
if ($weekday < 6) { // 只有월요일에도착하다周五才算作工作日
$days--;
}
}
return $result;
}
// 사용의 예
$startDate = new DateTime('2025-05-26');
$workDaysToSubtract = 3;
$newDate = subtractWorkingDays($startDate, $workDaysToSubtract);
echo $newDate->format('Y-m-d'); // 출력 결과가 있습니다2025-05-21,주말을 올바르게 건너 뛰십시오
형식 ( 'n')을 사용하여 주 번호, 1은 월요일, 7은 일요일입니다.
$ Days Count는 하루가 근무일 (1 ~ 5) 일 때만 감소합니다.
반복을 통해 빼고 뺄 수있는 일이 순전히 근무일인지 확인하십시오.
DATE_SUB를 직접 사용하여 일수를 빼면 주말이 포함될 수 있으므로 비즈니스 로직 오류가 발생할 수 있습니다.
그것이 근무일인지 주기적으로 결정하고 근무일에만 계산함으로써 근무일을 빼기위한 요구 사항을 정확하게 실현할 수 있습니다.
이 방법은 간단하고 효율적이며 근무일 계산이 필요한 대부분의 시나리오에 적합합니다.