작업 시간 계산
기본적으로 dhtmlxGantt는 작업 기간을 캘린더 시간으로 계산합니다. 즉, 주말과 공휴일이 전체 기간에 포함됩니다.
자세한 일정 종료일 형식에 대해서는 Task end date display & Inclusive end dates 문서를 참고하세요.
작업 시간 계산 활성화
작업 기간을 근무 시간만 기준으로 계산하려면 work_time에 설명된 옵션을 활성화하세요:
작업 기간에 대해 작업 시간 계산 활성화
gantt.config.work_time = true; // 작업 기간 계산에서 비근무 시간 제외 /*!*/
gantt.config.skip_off_time = true; /*!*/ // 차트에서 비근무 시간 숨김
gantt.init("gantt_here");
skip_off_time 옵션은 PRO 버전에서만 사용할 수 있습니다.
Duration includes only working days
duration_unit 설정에 따라 dhtmlxGantt는 작업 기간을 다양한 단위(예: duration_unit = "hour"인 경우, 근무 시간 기준)로 계산합니다.

소수점 형식의 작업 기간
이 기능은 PRO 에디션에서만 사용할 수 있습니다.
버전 6.3부터 dhtmlxGantt는 Duration Formatter 모듈을 이용해 작업 기간을 소수점 형식("2.5 days",
"0.5 hours", "3.75 hours")으로 지정할 수 있습니다.
내부적으로 Gantt는 작업 기간을 정수 값으로 저장한다는 점에 유의해야 합니다.
formatter 모듈은 사용자가 입력한 소수점 기간을 Gantt가 사용하는 내부 형식으로 변환하는 데 도움을 줍니다(예: 사용자가 "1.5 hours"를 입력하면 90분으로 저장). 또한 저장된 값을 사람이 읽을 수 있는 형식(예: 12시간을 "0.5 days"로 변환)으로 다시 변환합니다.

작업 기간은 duration_unit에서 지원하는 시간, 일 등 다양한 단위의 소수로 표현할 수 있으나, 분(minute) 단위는 제외됩니다.
소수점 형식 구현
작업 기간을 소수점 형식으로 표시하려면 다음 단계를 따르세요:
- duration_unit를 "minute"으로 설정
gantt.config.work_time = true;
gantt.config.duration_unit = "minute"; /*!*/
기간을 저장하는 단위는 소수점으로 표시할 단위보다 더 작아야 합니다. 쉽게 말해:
-
사용자가 시간 단위 소수(예: "0.5 hours")로 입력할 수 있게 하려면 duration_unit를 "minute"으로 설정
-
일 단위 소수를 허용하려면 duration_unit를 "hour"로 설정합니다. 이 경우 사용자는 "0.5 day"와 같이 입력할 수 있지만, "0.5 hour"는 1시간으로 반올림됩니다(기간은 정수 시간 단위로 저장됨).
기본적으로 작업 날짜는 타임스케일에 스냅됩니다. 스케일이 일(day) 단위인 경우, 하루 내에서 시간 단위로 작업을 드래그하려면 이 기능을 비활성화하세요.
이 기능을 사용하려면 round_dnd_dates를 비활성화하고 time_step에 적절한 값을 설정하세요.
예시:
// 전역 타임스텝을 15분으로 설정, duration_unit이 "minute"이어야 함
gantt.config.time_step = 15;
gantt.config.round_dnd_dates = false;
또는
// 전역 타임스텝을 1시간으로 설정,
// duration_unit이 "hour"인 경우에 적합
gantt.config.time_step = 60;
gantt.config.round_dnd_dates = false;
- formatter 객체를 생성하여 기간 포맷을 처리합니다:
// duration formatter 설정
const formatter = gantt.ext.formatters.durationFormatter({
enter: "day",
store: "minute", // duration_unit
format: "day",
hoursPerDay: 8,
hoursPerWeek: 40,
daysPerMonth: 30
});
- "Duration" 열에 formatter를 추가하려면, 포맷된 기간을 반환하는 template 함수를 정의하세요:
gantt.config.columns = [
{ name: "text", tree: true, width: 170, resize: true, editor: textEditor },
{ name: "start_date", align: "center", resize: true, editor: dateEditor },
{ name: "duration", label: "Duration", resize: true, align: "center",
template: task => formatter.format(task.duration), width: 100 },
{ name: "add", width: 44 }
];
- lightbox의 time 컨트롤의 formatter 속성에 formatter를 할당하여 추가합니다:
gantt.config.lightbox.sections = [
{ name: "description", map_to: "text", type: "textarea", height: 70, focus: true },
{ name: "time", map_to: "auto", type: "duration", formatter: formatter }
];
- 그리드에서 인라인 편집이 활성화된 경우, durationEditor 객체의 formatter 속성에도 formatter를 추가하세요:
const durationEditor = {
type: "duration",
map_to: "duration",
formatter: formatter, /*!*/
min: 0,
max: 1000
};
gantt.config.columns = [
{ name: "text", tree: true, width: 170, resize: true },
{ name: "start_date", align: "center", resize: true },
{ name: "duration", label: "Duration", resize: true, align: "center",
template: (task) => formatter.format(task.duration),
editor: durationEditor, width: 100 },
{ name: "add", width: 44 }
];
이미 Gantt에서 작업 기간을 분, 시간 또는 다른 단위로 저장하고 있다면, Duration Formatter 모듈을 사용해 소수점 형식으로 표시할 수 있습니다.
전역 설정
근무 시간 설정
기본 근무 시간은 다음과 같습니다:
- 근무일: 월요일 ~ 금요일
- 근무 시간: 8:00 - 12:00, 13:00 - 17:00
근무 시간을 사용자 정의하려면 setWorkTime 메서드를 사용하세요:
근무 시간 사용자 정의
// 근무일의 근무 시간 변경
gantt.setWorkTime({ hours: ["9:00-18:00"] });
// 모든 금요일을 휴일로 지정
gantt.setWorkTime({ day: 5, hours: false });
// 금요일, 토요일의 근무 시간 지정
gantt.setWorkTime({ day: 5, hours: ["8:00-12:00"] });
gantt.setWorkTime({ day: 6, hours: ["8:00-12:00"] });
// 특정 날짜를 근무일로 지정
gantt.setWorkTime({ date: new Date(2025, 2, 31) });
// 특정 날짜를 휴일로 지정
gantt.setWorkTime({ date: new Date(2025, 0, 1), hours: false });
야간 근무 시간 설정
setWorkTime 메서드에서 hours 속성을 설정할 때, 시간 구간은 오름차순으로 나열해야 합니다. 순서가 올바르지 않으면 일부 구간이 무시될 수 있습니다. 예를 들어, 아래와 같이 18:00 이후 구간은 무시됩니다:
// 잘못된 순서의 예시
gantt.setWorkTime({ day: 5, hours: ["16:00-18:00", "14:00-15:00", "08:00-10:00"] });
gantt.setWorkTime({ day: 5, hours: ["16:00-18:00", "00:00-04:00", "05:00-06:00"] });
야간 근무처럼 하루를 넘기는 근무 시간은 두 날짜에 걸쳐 구간을 나누어 지정해야 합니다:
- 첫째 날의 24시간 내에서
- 다음 날의 24시간 내에서
예시:
gantt.setWorkTime({ day: 5, hours: ["16:00-18:00"] });
gantt.setWorkTime({ day: 6, hours: ["00:00-04:00", "05:00-06:00"] });
근무 시간 규칙 구성
setWorkTime 메서드의 customWeeks 속성을 사용하여 기간별로 다양한 근무 시간 규칙을 정의할 수 있습니다. 예를 들어, 겨울철 근무 시간 조정:
// 겨울 철 근무 시간 변경
gantt.setWorkTime({
customWeeks: {
winter: {
from: new Date(2025, 11, 1), // 2025년 12월 1일
to: new Date(2026, 2, 1), // 2026년 3월 1일
hours: ["9:00-13:00", "14:00-16:00"],
days: [1, 1, 1, 1, 0, 0, 0]
}
}
});
분 단위(예: "8:15-12:45")로 근무 시간을 지정하려면 duration_unit를 *"minute"*으로 설정하세요.
분 단위로 근무 시간 설정
gantt.config.duration_unit = "minute";
// 분 단위로 근무 시간 설정
gantt.setWorkTime({ hours: ["8:15-12:45"] });
7.0 버전 이전에 사용하던 근무 시간 형식도 계속 지원됩니다:
gantt.setWorkTime({ hours: [9, 18] });
근무 시간 규칙 덮어쓰기
같은 날짜에 대해 메서드를 여러 번 호출하면 이전 근무 시간 규칙이 덮어써집니다. 규칙을 해제하려면 setWorkTime를 다른 구성으로 호출하세요:
gantt.setWorkTime({ hours: ["8:00-12:00"] });
gantt.setWorkTime({ hours: ["13:00-17:00"] });
// 최종 근무 시간은 13:00-17:00만 적용되며,
// 두 설정이 결합되지 않습니다.
사용자 지정 근무일/휴무일 설정
모든 근무일이나 근무 시간을 제외하는 근무 시간 설정은 적용할 수 없다는 점에 유의하세요. 예를 들어, 아래와 같은 코드는 동작하지 않습니다.
gantt.setWorkTime({ day: 0, hours: [] });
gantt.setWorkTime({ day: 1, hours: [] });
gantt.setWorkTime({ day: 2, hours: [] });
gantt.setWorkTime({ day: 3, hours: [] });
gantt.setWorkTime({ day: 4, hours: [] });
gantt.setWorkTime({ day: 5, hours: [] });
gantt.setWorkTime({ day: 6, hours: [] });
이 경우 Gantt는 적어도 한 근무일에 대해서는 메서드 호출을 무시하며, 해당 요일에는 여전히 근무 시간이 남아 있게 됩니다.
특정 날짜에서 가장 가까운 근무 시간이나 기간을 계산하려고 하면, 유효한 날짜나 기간을 찾지 못하게 됩니다. 즉, 이런 캘린더 설정은 실제로 작동하지 않습니다. 특정 날짜에 근무 시간을 설정하더라도, Gantt는 근무일과 근무 시간이 포함된 범위 내에서만 날짜를 계산할 수 있으므로 올바르게 동작하지 않습니다. 이 범위 밖의 계산은 실패하거나 오류를 발생시킬 수 있습니다.
몇 개월 또는 몇 년 전체가 모두 휴무일인 캘린더를 만들고 싶다면, setWorkTime() 메서드의 customWeeks 옵션을 사용해야 합니다. 원하는 범위 내에서 근무일과 근무 시간을 정의하려면 다음과 같이 해야 합니다.
- 범위를 근무 시간이 없는 기간으로 분할합니다.
- 필요한 날짜에 근무 시간을 설정합니다.
gantt.setWorkTime({ date: new Date(2025, 3, 10), hours: ["8:00-12:00"] })
gantt.setWorkTime({ date: new Date(2025, 3, 11), hours: ["13:00-17:00"] })
gantt.setWorkTime({
customWeeks: {
period1: {
from: new Date(2025, 3, 1),
to: new Date(2025, 3, 10),
hours: false,
},
period2: {
from: new Date(2025, 3, 12),
to: new Date(2025, 5, 1),
hours: false,
},
}
});
Related example: Using customWeeks to make all days in the calendar days-off
근무 시간 해제하기
unsetWorkTime 메서드를 사용하여 근무 시간 설정을 제거할 수 있습니다.
// 근무일의 근무 시간을 ["8:00-17:00"]에서 ["8:00-12:00"]로 변경
gantt.setWorkTime({ hours: ["8:00-12:00"] });
// 근무 시간 설정 제거
gantt.unsetWorkTime({ hours: ["8:00-12:00"] });
근무 시간 확인하기
특정 날짜가 근무 시간 내에 포함되는지 확인하려면 isWorkTime 메서드를 사용하세요.
// 2025년 1월 1일을 휴무일로 지정
gantt.setWorkTime({ date: new Date(2025, 0, 1), hours: false });
gantt.isWorkTime(new Date(2025, 0, 1)); // -> false /*!*/
// 2025년 3월 15일을 8:00~17:00 근무일로 지정
gantt.setWorkTime({ date: new Date(2025, 2, 15), hours: ["8:00-17:00"] });
gantt.isWorkTime(new Date(2025, 2, 15, 10, 0), "hour"); // -> true /*!*/
gantt.isWorkTime(new Date(2025, 2, 15, 8, 0), "hour"); // -> false /*!*/
근무 시간 조회하기
특정 날짜의 근무 시간을 조회하려면 getWorkHours 메서드를 사용하세요.
gantt.getWorkHours(new Date(2025, 3, 30)); // -> ["8:00-17:00"]
주어진 날짜에서 가장 가까운 근무일을 찾으려면 getClosestWorkTime 메서드를 사용하세요.
gantt.getClosestWorkTime(new Date(2025, 3, 30));
특정 근무 시간 반복 설정
매월 마지막 금요일을 단축 근무일로 지정하거나 12월 25일을 휴일로 지정하는 등, 특정 요일이나 날짜에만 반복적으로 근무 시간을 설정해야 하는 경우가 있습니다.
현재 dhtmlxGantt는 이런 반복 근무 시간에 대한 내장 설정을 제공하지 않습니다. 지원되는 기능은 다음과 같습니다.
- 요일별 근무 시간 설정 (월요일, 화요일 등)
- 특정 날짜의 근무 시간 설정 (예: 2025년 6월 4일)
- 날짜 범위에 대한 근무 시간 규칙 재정의 (예: 2025년 6월 1일 ~ 9월 1일)
따라서 근무 시간 규칙에 예외가 있다면, 조건에 맞는 날짜를 직접 찾아서 각 날짜에 근무 시간 설정을 적용해야 합니다.
예를 들어, 프로젝트가 5년에 걸쳐 진행되고 1월 1일을 매년 휴무일로 지정하려면 다음과 같이 하드코딩할 수 있습니다.
gantt.setWorkTime({ hours: false, date: new Date(2025, 0, 1) });
gantt.setWorkTime({ hours: false, date: new Date(2026, 0, 1) });
gantt.setWorkTime({ hours: false, date: new Date(2027, 0, 1) });
gantt.setWorkTime({ hours: false, date: new Date(2028, 0, 1) });
gantt.setWorkTime({ hours: false, date: new Date(2029, 0, 1) });
다음은 프로젝트 기간 동안 매월 마지막 금요일을 단축 근무일로 지정하는 예시입니다.
const lastFridayOfMonth = (date) => {
let lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
if (lastDay.getDay() < 5) {
lastDay.setDate(lastDay.getDate() - 7);
}
lastDay.setDate(lastDay.getDate() - (lastDay.getDay() - 5));
return lastDay;
};
const projectStart = new Date(2025, 5, 1);
const projectEnd = new Date(2026, 5, 1);
let currentDate = new Date(projectStart);
while (currentDate <= projectEnd) {
const lastFriday = lastFridayOfMonth(currentDate);
gantt.setWorkTime({ hours: ["8:00-12:00", "13:00-15:00"], date: lastFriday });
currentDate = gantt.date.add(currentDate, 1, "month");
}
휴무 시간 색상 표시하기
차트 영역에서 휴무 시간을 강조 표시하려면 timeline_cell_class 템플릿을 사용하세요.
gantt.templates.timeline_cell_class = (task, date) =>
!gantt.isWorkTime({ task, date }) ? "week_end" : "";
자세한 내용은 타임 슬롯 하이라이트하기 문서를 참고하세요.
휴무 시간을 숨기고 싶다면, 스케일에서 시간 단위 숨기기 문서에 설명된 방법을 참고하세요.
다중 근무 시간 캘린더
글로벌 근무 시간 설정 외에도, Gantt에서는 여러 개의 근무 시간 캘린더를 생성할 수 있습니다. 이러한 캘린더는 특정 작업이나 작업 그룹에 할당할 수 있습니다.
근무 캘린더 생성하기
createCalendar 메서드를 사용하여 새로운 캘린더 인스턴스를 생성할 수 있습니다.
이 방법에는 두 가지 방식이 있습니다.
- 파라미터 없이 호출하면, 하루 24시간, 주 7일 근무하는 전체 근무 캘린더가 생성됩니다.
const calendar = gantt.createCalendar();
- 기존 캘린더를 기반으로 새로운 옵션으로 캘린더를 만들고 싶다면, 기존 캘린더를 createCalendar 메서드의 인자로 전달하면 됩니다.
const newCalendar = gantt.createCalendar(calendar);
처음 생성된 캘린더 객체는 Gantt와 분리되어 있으며, Gantt에 추가할 때까지 아무런 영향을 미치지 않습니다.
근무 캘린더 Gantt에 추가하기
캘린더를 생성한 후에는 addCalendar 메서드를 사용하여 Gantt에 추가해야 합니다. 방법은 두 가지가 있습니다.