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

Groovy中UTC时间加30分钟及12/24小时格式异常排查

解决Groovy中UTC日期解析的12/24小时制问题

嘿,我来帮你搞定这个日期解析的坑!你遇到的核心问题是解析UTC日期时用错了小时格式符,导致中午12点被当成了凌晨0点,最终输出结果差了整整12小时。

问题根源

你在解析日期时用了hh格式符:

def formatString = "yyyy-MM-dd'T'hh:mm:ss.S'Z'";

hh代表的是12小时制的小时(范围1-12),当输入的时间是12:11时,它会被默认解析成午夜0点(12小时制里的12对应午夜),这就是为什么后续加30分钟后变成了00:41。

另外还有两个容易忽略的细节:

  1. 输入的毫秒部分是.000,用SSS比S更准确(S是单一位毫秒,SSS匹配三位完整毫秒)
  2. SimpleDateFormat默认使用本地时区,解析UTC日期时最好显式设置时区为UTC,避免本地时区带来的偏移问题

修正后的代码

import java.text.SimpleDateFormat
import java.util.TimeZone
import groovy.time.TimeCategory

def TxnTm = '2018-01-22T12:11:00.000Z';
def inputString = TxnTm;
// 把hh改成HH(24小时制),S改成SSS匹配三位毫秒
def formatString = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
def sdf = new SimpleDateFormat(formatString);
// 显式设置时区为UTC,确保解析的是标准UTC时间
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
def date = sdf.parse(inputString);
println date;

use(TimeCategory) {
    after30Mins = date + 30.minutes;
}

// 输出时同样设置时区为UTC,保证结果是UTC标准时间
def outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
outputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return outputFormat.format(after30Mins)

运行结果

这段代码的输出就是你预期的:

2018-01-22T12:41:00.000Z

补充说明

  • HH:24小时制的小时(范围00-23),完美匹配输入里的中午12点
  • 显式设置时区为UTC是关键,否则如果你的本地时区不是UTC,解析或格式化时会自动转换时区,导致时间偏差

内容的提问来源于stack exchange,提问作者Bhagvat Charturvedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:18:46