问题
在feign传输date类型的数据时,在调用方时间正确,而被调用方获取时时间会相差14个小时。
原因
Feign客户端在进行通信时,会将Date类型对象转为String类型,如果这个时间是北京时间2019年2月19日20点30分,因为中国的时区叫做CTS,所以转化后的String为“Tue Feb 19 20:30:00 CST 2019”. 服务端将接收的String类型日期转换为Date类型,转换采用的是Date的默认构造器new Date(‘Tue Feb 19 20:30:00 CST 2019’),这里就是错误发生的时刻,因为CTS代表的时区其实有四个(Central Standard Time (USA) UT-6:00、Central Standard Time (Australia) UT+9:30、China Standard Time UT+8:00、Cuba Standard Time UT-4:00),同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。根据JavaDoc,jvm会将CTS理解成了美国中部时区,因此造成了时区错误。
JVM见到CTS默认是美国的时区(UT-6:00),与中国时区(UT+8:00)相差14个小时。
解决方法
使用String类型作为参数,在接收方进行类型转换
使用JDK8中的LocalDate/LocalDateTime
第三种方法增加配置类,使Feign使用自定义的规则转换
LocalDateTime与Data转换
public void LocalDateTimeToUdate() {
LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
博客详细讨论了Feign在传输Date类型数据时遇到的时区问题,导致被调用方接收到的时间相差14小时。问题源于CTS时区标识在Java中可能被误解析为美国中部时区。解决方案包括使用String类型参数、JDK8的LocalDate/LocalDateTime,或者自定义Feign的日期转换规则。文章提供了具体的日期转换代码示例。
2168

被折叠的 条评论
为什么被折叠?



