SpringBoot接口返回的數(shù)據(jù)時間與實際相差8小時問題排查方式
SpringBoot接口返回的數(shù)據(jù)時間與實際相差8小時問題
場景描述
部署了一個SpringBoot應用在容器中,請求一個接口,接口返回的時間與實際相差8小時。
可能原因
1、容器的時區(qū)與實際時區(qū)相差差8小時
2、jvm時區(qū)與實際時區(qū)相差8小時
3、存入數(shù)據(jù)庫后的時間相差8小時
4、后端獲取的時間一致,但返回給前端后相差8小時
排查步驟
1、進入容器查看時間
$ date
2、編寫一個java應用查看jvm時間
import java.util.Date; public class Demo { public static void main(String[] args) { Date date = new Date(); System.out.println(date); } }
3、查看數(shù)據(jù)庫時間
打開數(shù)據(jù)庫,查看數(shù)據(jù)庫中存儲的數(shù)據(jù)庫時間是否與實際一致
4、在后臺打印出后端獲取到的數(shù)據(jù)的時間,是否與前端一致
解決方案
容器時區(qū)與實際時區(qū)相差8小時:
如果排查第一步獲取到的時間與實際時間相差8小時,建議在容器的Dockerfile中添加以下內(nèi)容:
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezone
jvm時區(qū)與實際時區(qū)相差8小時:
如果排查第二步獲取到的時間與實際時間相差8小時,可以在SpringBoot的面向切面上或者main類上加以下代碼
@PostConstruct void started() { TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); }
存入數(shù)據(jù)庫的時間與實際時區(qū)相差8小時:
如果排查第三步獲取到的時間與實際時間相差8小時,可以在SpringBoot應用配置文件application.yml修改數(shù)據(jù)庫連接信息,url末尾添加serverTimeZone=GMT%2b8
Spring的json構造器導致時區(qū)不一致:
以上三種情況的根本原因是由于環(huán)境初始的時區(qū)未配置,最佳方案就是在應用部署前就配置好各自的時區(qū)。
排查第四步出現(xiàn)時區(qū)不一致,是spring的json構造器的時區(qū)與實際的不一致。
可以修改springboot配置文件application.yml,添加以下內(nèi)容:
spring: jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java IO中字節(jié)流復制圖片實現(xiàn)代碼
這篇文章主要介紹了Java IO中字節(jié)流復制圖片實現(xiàn)代碼的相關資料,需要的朋友可以參考下2017-04-04在SpringBoot中實現(xiàn)多種方式登錄(通過用戶名、手機號、郵箱等)的詳細指南
今天,我們將跳進 Spring Boot 的世界,探索如何通過 用戶名、手機號、郵箱 等多種方式實現(xiàn)登錄,而我們要做的就是為他們提供這些選擇,確保他們都能毫無阻礙地進入我們的系統(tǒng),感興趣的小伙伴跟著小編一起來看看吧2024-11-11SpringBoot+aop實現(xiàn)主從數(shù)據(jù)庫的讀寫分離操作
讀寫分離的作用是為了緩解寫庫,也就是主庫的壓力,但一定要基于數(shù)據(jù)一致性的原則,就是保證主從庫之間的數(shù)據(jù)一定要一致,這篇文章給大家介紹SpringBoot+aop實現(xiàn)主從數(shù)據(jù)庫的讀寫分離操作,感興趣的朋友跟隨小編一起看看吧2024-03-03Springboot升級至2.4.0中出現(xiàn)的跨域問題分析及修改方案
這篇文章主要介紹了Springboot升級至2.4.0中出現(xiàn)的跨域問題分析及修改方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12