Java XMLGregorianCalendar时间转换多出2小时异常问题咨询
1. 异常现象成因
XMLGregorianCalendar的toGregorianCalendar()方法每次调用都会返回一个全新的GregorianCalendar实例,你代码中第一次调用该方法时为返回的临时实例设置了UTC时区,但后续格式化时第二次调用该方法生成了新的未修改时区的实例,之前的时区设置完全未生效。SimpleDateFormat默认会使用JVM运行环境的系统默认时区,从你的输出后缀+0200可以看出当前运行环境默认时区为UTC+2,因此它会将原始的UTC时间转换为UTC+2时区的时间,最终显示的小时数就比原始UTC时间多了2小时。
2. 最小改动修复方案
不需要做大规模重构,仅调整现有代码的少量逻辑即可修复问题,不需要引入新依赖或替换时间API:
String pattern = "yyyy-MM-dd'T'HH:mm:ssZ"; public String getDate(XMLGregorianCalendar input) { DateFormat f = new SimpleDateFormat(pattern); // 为SimpleDateFormat显式指定UTC时区,不受运行环境默认时区影响 f.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC)); String output = f.format(input.toGregorianCalendar().getTime()); System.out.println(output); return output; }
改动说明:
- 删掉无效的
input.toGregorianCalendar().setTimeZone代码行,避免无意义的临时对象操作 - 直接给
SimpleDateFormat实例设置UTC时区,强制按UTC规则格式化时间戳 - 修复后输入
2021-03-12T10:42:01.000Z会输出2021-03-12T10:42:01+0000,符合目标格式要求。
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

