현재 위치: > 최신 기사 목록> Date_Sub 기능을 사용하여 주중을 빼기 : 주말을 피하는 방법

Date_Sub 기능을 사용하여 주중을 빼기 : 주말을 피하는 방법

gitbox 2025-05-28

단순히 일수를 단순히 줄이는 것이 실수를하는 이유는 무엇입니까?

예를 들어, 오늘이 월요일 (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 (금요일)이며 정확한 것으로 보입니다. 그러나 시작 날짜가 월요일이고 빼기 근무일이 크면 토요일과 일요일이 포함되며 계산 결과가 벗어날 것입니다.


솔루션 아이디어

  1. 주기 감소 일 : 매일 감소의 경우 먼저 하루가 주말 (토요일 또는 일요일)인지 결정하십시오.

  2. 주말 건너 뛰기 : 하루가 주말이라면 감소는 평일 감소에 의존하지 않습니다.

  3. 요구 사항을 충족하기 위해 근무일 수를 계속 줄입니다 .


코드 예제

아래는 지정된 날짜 시작하여 지정된 근무일 수를 빼고 주말을 건너 뜁니다.

 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를 직접 사용하여 일수를 빼면 주말이 포함될 수 있으므로 비즈니스 로직 오류가 발생할 수 있습니다.

  • 그것이 근무일인지 주기적으로 결정하고 근무일에만 계산함으로써 근무일을 빼기위한 요구 사항을 정확하게 실현할 수 있습니다.

  • 이 방법은 간단하고 효율적이며 근무일 계산이 필요한 대부분의 시나리오에 적합합니다.