SpringBoot多時(shí)區(qū)

問(wèn)題說(shuō)明
JAVA進(jìn)程在運(yùn)行過(guò)程中發(fā)現(xiàn)和當(dāng)前時(shí)間相差8小時(shí),檢查服務(wù)器時(shí)間和互聯(lián)網(wǎng)的北京時(shí)間一致,由此推測(cè)操作系統(tǒng)時(shí)區(qū)不對(duì),經(jīng)過(guò)查看操作系統(tǒng)時(shí)區(qū),發(fā)現(xiàn)時(shí)區(qū)正確,通過(guò)jinfo命令查看Java進(jìn)程發(fā)現(xiàn)時(shí)區(qū)不是東八區(qū),由此找到原因,在此把排查過(guò)程做簡(jiǎn)要記錄,便于后續(xù)遇到問(wèn)題快速解決。

中國(guó)跨越了東五區(qū)、東六區(qū)、東七區(qū)、東八區(qū)、東九區(qū)五個(gè)時(shí)區(qū),一般都統(tǒng)一采用東八區(qū)計(jì)時(shí)時(shí)間。

查看操作系統(tǒng)當(dāng)前時(shí)間

[root@swk-204 ~]# date

Fri Jan 25 19:28:28 CST 2019

[root@swk-204 ~]# date "+%Y-%m-%d %H:%M:%S"

2019-01-25 19:28:36
[root@swk-204 ~]#
查看操作系統(tǒng)當(dāng)前時(shí)區(qū)
方式一

[root@swk-204 ~]# date -R

Fri, 25 Jan 2019 19:04:13 +0800
-0800表示西八區(qū),是美國(guó)舊金山所在的時(shí)區(qū),+0800表示東八區(qū),是中國(guó)上海所在的時(shí)區(qū)

方式二

[root@swk-204 ~]# date "+%Z"

CST
方式三

[root@swk-204 ~]# date

Fri Jan 25 19:05:43 CST 2019
方式四

[root@engine ~]# cat /etc/localtime 

CST-8
時(shí)區(qū)為CST-8

通過(guò)grep關(guān)鍵字進(jìn)行過(guò)濾

[root@engine bin]# jinfo 1728 |grep user.timezone

user.timezone = GMT
時(shí)區(qū)為GMT

JAVA進(jìn)程調(diào)整時(shí)區(qū)
修改Java虛擬機(jī)時(shí)間
JAVA啟動(dòng)參數(shù)

-Duser.timezone=GMT+8

每個(gè)java程序啟動(dòng)的時(shí)候加參數(shù)

1.啟動(dòng)文件中的TimeZone設(shè)置:

public static void main(String[] args) {
        TimeZone timeZone = TimeZone.getTimeZone("UTC");
        TimeZone.setDefault(timeZone);
        SpringApplication.run(MatrixApplication.class, args);
    }

只對(duì)運(yùn)行的console日志的時(shí)間影響。
2.數(shù)據(jù)連接字符串

jdbc:mysql://localhost:3306/gmall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

對(duì)與讀取到的時(shí)間會(huì)自動(dòng)減去+8小時(shí)插入到數(shù)據(jù)庫(kù)(如果數(shù)據(jù)庫(kù)設(shè)置的utc+8的北京時(shí)間的),查詢的時(shí)候

3.springboot 接口時(shí)間字段返回配置

spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone: GMT+8

對(duì)springboot rest接口時(shí)間字段生效。

時(shí)間格式化時(shí)區(qū)設(shè)置
如果沒(méi)有設(shè)置會(huì)使用程序運(yùn)行系統(tǒng)的默認(rèn)的時(shí)區(qū)。

SimpleDateFormat dd=new SimpleDateFormat("yyyy/MM/dd");
        log.info(TimeZone.getDefault().toString()); // 系統(tǒng)默認(rèn)時(shí)區(qū)
        log.info(dd.getTimeZone().toString());//SimpleDateFormat 使用的時(shí)區(qū)
        log.info(dd.parse(dstr1).toString());
        //dd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        dd.setTimeZone((TimeZone.getTimeZone("Australia/Sydney")));//設(shè)置指定時(shí)區(qū)解析
        log.info(dd.parse(dstr1).toString());

5.數(shù)據(jù)庫(kù)時(shí)區(qū)設(shè)置:

show variables like '%time_zone%';
mysql> set time_zone='+8:00';

修改后 select 結(jié)果(timestamp)轉(zhuǎn)換成相應(yīng)timezone時(shí)間展示,DateTime字段不變化
插入的時(shí)間時(shí)轉(zhuǎn)換相應(yīng)的timezone時(shí)間插入

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容