JIRA中Groovy脚本调用TimeZone.setDefault()的时区相关技术问询
现有环境说明
运行在全球多节点的JIRA Cloud实例,支持Groovy脚本。现有脚本用于创建新JIRA工单及工单流转时,检查并设置特定自定义字段值,其中部分受影响字段为日期时间类型(如「截止日期」「修复完成日期」等),脚本需要处理这类字段。
脚本执行主操作前,会临时将时区设置为UTC:
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
注意:此处时区设置并非针对登录用户,而是全局设置。
问题
- 该调用的时区变更作用域是什么?
- 此调用是否会影响JIRA用户对日期时间值的查看?
- 若脚本变更时区期间,有未被脚本处理的JIRA工单被添加或修改,时区恢复原值后是否会影响该工单的字段值?
Groovy文档未明确该变更的作用域,Java文档指出变更影响Java虚拟机(JVM)。需明确:在JIRA实例中运行的Groovy脚本,该变更仅作用于脚本自身空间、当前节点所有Groovy脚本、当前节点整个JIRA实例,还是所有节点?
更新
Atlassian官方文档提及,修改默认时区(包括JIRA插件内的操作)可能会引发负面影响,比如出现时间戳显示错误的问题。鉴于Groovy与JIRA系统深度集成,脚本中修改全局默认时区可能会触发这类问题。
问题解答
1. 时区变更的作用域
在JIRA Cloud的多节点环境中,TimeZone.setDefault()的作用域是当前脚本所在节点的整个JVM进程。JIRA Cloud的每个节点都是独立的JVM实例,因此该变更不会跨节点生效;但在当前节点内,所有共享该JVM的代码(包括其他Groovy脚本、JIRA核心服务、其他插件代码)都会受其影响,直到JVM默认时区被再次修改或进程重启。
2. 是否影响用户查看日期时间值
会产生潜在影响。JIRA原生逻辑会基于用户个人时区设置,将存储的UTC时间转换后展示,但如果JVM默认时区被修改,部分依赖该默认时区的自定义代码(如未显式指定时区的脚本逻辑、第三方插件)可能出现时间计算错误,导致存储的时间戳本身偏差,最终用户看到的时间会不正确。
3. 时区恢复后是否影响未被脚本处理的工单
若未被脚本处理的工单是通过JIRA原生接口创建/修改的,日期时间字段值不会受影响——因为JIRA原生逻辑始终以UTC为存储基准,不受JVM默认时区变更干扰。但如果这些工单的操作涉及了依赖JVM默认时区的自定义脚本或插件,就可能出现时间存储错误,即使之后时区恢复,已错误存储的时间值也不会自动修正。
关于JVM作用域的补充说明
该变更不会仅局限于脚本自身空间,TimeZone.setDefault()是修改整个JVM的全局默认时区,而非脚本局部上下文。它会影响当前节点上所有运行在该JVM内的代码,但不会扩散到其他节点的JVM实例。
内容的提问来源于stack exchange,提问作者Dr.CKYHC

