You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:57:48