Jira Data Center:如何计算任务处于In Progress状态的天数?
Jira Data Center统计In Progress状态天数(忽略时分秒)
现有输出翻译
你提供的addMessage输出内容翻译为中文如下:
com.atlassian.jira.issue.history.ChangeItemBean@1e5b1b95[字段类型=jira,字段=状态,来源ID=10614,来源名称=In Progress,目标ID=10614,目标名称=In Progress,创建时间=2024-02-26 14:29:31.846], com.atlassian.jira.issue.history.ChangeItemBean@21c854c9[字段类型=jira,字段=状态,来源ID=14201,来源名称=Testing,目标ID=10614,目标名称=In Progress,创建时间=2024-02-26 14:29:31.47], com.atlassian.jira.issue.history.ChangeItemBean@1b94684b[字段类型=jira,字段=状态,来源ID=10614,来源名称=In Progress,目标ID=10501,目标名称=CODE REVIEW,创建时间=2023-12-13 18:02:23.731]
完整解决方案脚本
以下是完成天数统计的Groovy脚本,已适配忽略时分秒、处理当前状态的需求:
import com.atlassian.jira.component.ComponentAccessor import java.time.LocalDate import java.time.ZoneId // 要统计的目标状态名称 final statusName = 'In Progress' def changeHistoryManager = ComponentAccessor.changeHistoryManager def currentStatus = issue.status.name // 获取所有状态变更记录,并按创建时间正序排列(保证时间线从旧到新) def changeItems = changeHistoryManager.getChangeItemsForField(issue, "status") .sort { it.created } long totalDays = 0 LocalDate inProgressStart = null // 适配Jira服务器时区,避免日期转换偏差 def zoneId = ZoneId.systemDefault() // 遍历所有状态变更记录,计算每一段In Progress的时长 changeItems.each { item -> // 将变更时间转换为本地日期(自动忽略时分秒) LocalDate changeDate = item.created.toInstant().atZone(zoneId).toLocalDate() // 触发条件:进入In Progress状态 if (item.toString == statusName) { inProgressStart = changeDate } // 触发条件:离开In Progress状态,且之前有进入记录 else if (item.fromString == statusName && inProgressStart != null) { // 计算两段日期的天数差 long days = java.time.temporal.ChronoUnit.DAYS.between(inProgressStart, changeDate) totalDays += days inProgressStart = null // 重置起始日期,准备下一段统计 } } // 处理当前任务仍处于In Progress状态的情况 if (currentStatus == statusName && inProgressStart != null) { LocalDate today = LocalDate.now(zoneId) long days = java.time.temporal.ChronoUnit.DAYS.between(inProgressStart, today) totalDays += days } // 输出最终统计结果 addMessage("任务处于「${statusName}」状态的总天数:${totalDays}")
关键逻辑说明
- 排序变更记录:Jira默认返回的变更记录是倒序(最新在前),必须正序排序才能保证时间线遍历的正确性。
- 日期处理:使用Java 8的
LocalDate类型自动忽略时分秒,同时适配服务器时区避免日期偏差。 - 天数计算:通过
ChronoUnit.DAYS.between计算两个日期的天数差,完全符合“忽略时分秒只算日期”的需求(例如当天进入当天离开则计为0天)。 - 边界处理:自动识别任务当前是否仍处于In Progress状态,补充计算从最后一次进入到当天的天数。
- 无效变更过滤:对于输出中出现的“从In Progress到In Progress”的无效变更,脚本会自动跳过,不会影响统计结果。
内容的提问来源于stack exchange,提问作者Darya Yankovskaya
相关产品推荐
相关产品推荐

