問(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í)間插入