1.問題
後臺時間正確,返回給前臺的時間不正確,和後臺差8個小時
後臺打印的時間如下:
數據庫存儲時間如下:
接口返回給前臺的時間如下:
相差8個小時
原因
spring中對於@RestController或者@Controller+@ResponseBody
註解的接口方法的返回值默認是Json格式,
所以當對於date類型的數據,在返回瀏覽器端是會被spring-boot
默認的Jackson框架轉換,而Jackson框架默認的時區GMT(相對於中國是少了8小時)。
方案
1 如果你的項目是 spring-boot
在application.properties添加配置 配置spring的時區 這條語句能解決你時間少8個小時問題
spring.jackson.time-zone=GMT+8
在跟上一條時間戳配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
可以是Date時間格式化,一般這兩條語句一起用
2 如果你的項目是 springMvc
這個主要是因爲時區的問題,只要在Spring的配置文件中設置好時區就好了。代碼如下:
<mvc:annotation-driven>
<!-- 處理請求時返回json字符串的中文亂碼問題 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<!--處理時區問題-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<!-- 處理responseBody 裏面日期類型 -->
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
</bean>
</property>
<!-- 時區指定 -->
<property name="timeZone" value="GMT+8" />
<!-- 爲null字段時不顯示 -->
<property name="serializationInclusion">
<value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
原因二
這個原因隱藏很深,當你發現你試過上面的方案後時間還是少的話,請檢查數據是從什麼時候時間變少了,若從數據庫查出來就少啦,若你有用的數據庫是mysql,且mysql.jar是6.x版本的話(與5.x不同),可能你配置的時區錯了
linux系統時區是UTC,而mysql使用的是系統時區。
方案
1 在 數據庫的配置文件 jdbd url 加上
serverTimezone=Asia/Shanghai
jdbc:mysql://localhost:3306/dcoj?serverTimezone=Asia/Shanghai
2、修改mysql數據庫的my.cnf文件的[mysqld]字段,添加default-time-zone=+8:00
3、修改linux系統時區爲Asia/Shanghai
mysql數據庫運行在docker容器中,所以要修改mysql容器的時區爲Asia/Shanghai。
進入mysql容器,鏈接文件,退出mysql容器,重啓mysql
docker exec -it mysql bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
exit
docker restart mysql