工作时间计算
默认情况下,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 支持),但不支持分钟的小数。
实现十进制格式
如需以十进制格式显示任务工期,请按以下步骤操作:
- 将 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 小时,因为工期以整小时存储。
默认情况下,任务日期会对齐到时间刻度。如果您的刻度为天,您可能希望禁用此功能,以便在一天内拖动任务到不同时段。
要实现此功能,请禁用 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 对象以处理工期格式化:
// 设置工期格式化器
const formatter = gantt.ext.formatters.durationFormatter({
enter: "day",
store: "minute", // duration_unit
format: "day",
hoursPerDay: 8,
hoursPerWeek: 40,
daysPerMonth: 30
});
- 通过定义模板函数,将 formatter 添加到 "Duration" 列中以返回格式化后的工期:
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 中,将 formatter 赋值给 time 控件的 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 }
];
- 如果启用了表格中的内联编辑,还需通过 formatter 属性将 formatter 添加到 durationEditor 对象:
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 /*!*/