問題
在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使用自定義的規則轉換