MPXJ 12.5.0技术问题:提取或计算拆分任务的持续时长
使用MPXJ 12.5.0处理拆分任务的持续时长计算
正确获取拆分任务的分段信息
你提到的getSplits()方法是获取拆分任务分段的正确API,每个返回的TaskSplit对象包含对应分段的完整时间信息:
getStart():分段的起始时间getFinish():分段的结束时间getDuration():分段的工期
如果之前调用未得到预期结果,可能是任务本身无拆分数据,或未正确遍历返回集合。示例代码:
Task targetTask = ...; // 获取目标拆分任务 List<TaskSplit> splitSegments = targetTask.getSplits(); for (TaskSplit segment : splitSegments) { LocalDateTime start = segment.getStart(); LocalDateTime finish = segment.getFinish(); Duration duration = segment.getDuration(); // 处理单段数据 }
计算特定状态日期下的实际持续时长
遍历所有拆分分段,判断分段与目标日期的时间交集,累加有效时长:
- 若分段在状态日期前结束,累加整个分段时长
- 若分段跨状态日期,计算从分段起始到状态日期的部分时长
- 若分段在状态日期后开始,不计入总时长
示例逻辑代码:
LocalDateTime statusDate = ...; // 指定的状态日期 Duration totalActualDuration = Duration.ZERO; for (TaskSplit segment : targetTask.getSplits()) { LocalDateTime segStart = segment.getStart(); LocalDateTime segFinish = segment.getFinish(); if (segFinish.isBefore(statusDate) || segFinish.isEqual(statusDate)) { totalActualDuration = totalActualDuration.plus(segment.getDuration()); } else if (segStart.isBefore(statusDate) && segFinish.isAfter(statusDate)) { Duration partial = Duration.between(segStart, statusDate); totalActualDuration = totalActualDuration.plus(partial); } }
备选方案:通过进度字段间接推算
若拆分分段数据获取异常,可结合任务进度字段估算:
getActualDuration():已完成的实际总时长getPercentComplete():任务完成百分比getRemainingDuration():剩余工期
这种方法精度低于直接拆分数据,仅作为临时替代。
内容的提问来源于stack exchange,提问作者Rafael Nobre
相关产品推荐
相关产品推荐

