後端 Date 時間 傳到前端,相差8小時

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
發佈了27 篇原創文章 · 獲贊 18 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章