Groovy日期时间比对容差设置及UTC格式输出问题咨询
问题根因
- Groovy/Java 底层的
java.util.Date对象本身不存储时区信息,仅存储自1970-01-01 00:00:00 UTC 算起的毫秒级时间戳 - 直接打印Date对象时,默认会调用
Date.toString()方法,该方法会读取JVM的系统默认时区(你的环境默认是EEST时区)格式化输出,和你解析时间时指定的UTC时区没有关联,所以不会按UTC格式输出
修复方案
方案1:打印时显式指定UTC时区(无侵入,推荐)
不要直接输出Date对象,使用格式化工具指定UTC时区后再打印,示例代码如下:
// 初始化UTC格式器 def utcFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") utcFormatter.timeZone = TimeZone.getTimeZone("UTC") // 打印时调用format方法转换 def dueDate = ... // 你解析得到的Date对象 println utcFormatter.format(dueDate) // 输出为UTC格式
注意:你解析
yyyy-MM-dd'T'HH:mm:ss'Z'格式的UTC时间字符串时,也必须给解析用的DateFormat设置UTC时区,否则会用默认时区解析,得到的时间戳本身就存在偏差。
方案2:全局修改JVM默认时区(影响全脚本逻辑,谨慎使用)
在脚本最开头统一设置JVM默认时区为UTC,后续所有直接打印Date对象的操作都会默认输出UTC格式:
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
内容的提问来源于stack exchange,提问作者Cata
相关产品推荐
相关产品推荐

