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。
另外还有两个容易忽略的细节:
- 输入的毫秒部分是
.000,用SSS比S更准确(S是单一位毫秒,SSS匹配三位完整毫秒) 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
相关产品推荐
相关产品推荐

