问题
在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
- 第三种方法增加配置类,使Feign使用自定义的规则转换