問題說明
JAVA進(jìn)程在運(yùn)行過程中發(fā)現(xiàn)和當(dāng)前時間相差8小時夷都,檢查服務(wù)器時間和互聯(lián)網(wǎng)的北京時間一致饰抒,由此推測操作系統(tǒng)時區(qū)不對,經(jīng)過查看操作系統(tǒng)時區(qū)加叁,發(fā)現(xiàn)時區(qū)正確哥力,通過jinfo命令查看Java進(jìn)程發(fā)現(xiàn)時區(qū)不是東八區(qū),由此找到原因墩弯,在此把排查過程做簡要記錄吩跋,便于后續(xù)遇到問題快速解決。
中國跨越了東五區(qū)渔工、東六區(qū)锌钮、東七區(qū)、東八區(qū)引矩、東九區(qū)五個時區(qū)梁丘,一般都統(tǒng)一采用東八區(qū)計時時間。
查看操作系統(tǒng)當(dāng)前時間
[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)前時區(qū)
方式一
[root@swk-204 ~]# date -R
Fri, 25 Jan 2019 19:04:13 +0800
-0800表示西八區(qū)旺韭,是美國舊金山所在的時區(qū),+0800表示東八區(qū)氛谜,是中國上海所在的時區(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
時區(qū)為CST-8
通過grep關(guān)鍵字進(jìn)行過濾
[root@engine bin]# jinfo 1728 |grep user.timezone
user.timezone = GMT
時區(qū)為GMT
JAVA進(jìn)程調(diào)整時區(qū)
修改Java虛擬機(jī)時間
JAVA啟動參數(shù)
-Duser.timezone=GMT+8
每個java程序啟動的時候加參數(shù)
1.啟動文件中的TimeZone設(shè)置:
public static void main(String[] args) {
TimeZone timeZone = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(timeZone);
SpringApplication.run(MatrixApplication.class, args);
}
只對運(yùn)行的console日志的時間影響。
2.數(shù)據(jù)連接字符串
jdbc:mysql://localhost:3306/gmall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
對與讀取到的時間會自動減去+8小時插入到數(shù)據(jù)庫(如果數(shù)據(jù)庫設(shè)置的utc+8的北京時間的)区端,查詢的時候
3.springboot 接口時間字段返回配置
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone: GMT+8
對springboot rest接口時間字段生效值漫。
時間格式化時區(qū)設(shè)置
如果沒有設(shè)置會使用程序運(yùn)行系統(tǒng)的默認(rèn)的時區(qū)。
SimpleDateFormat dd=new SimpleDateFormat("yyyy/MM/dd");
log.info(TimeZone.getDefault().toString()); // 系統(tǒng)默認(rèn)時區(qū)
log.info(dd.getTimeZone().toString());//SimpleDateFormat 使用的時區(qū)
log.info(dd.parse(dstr1).toString());
//dd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
dd.setTimeZone((TimeZone.getTimeZone("Australia/Sydney")));//設(shè)置指定時區(qū)解析
log.info(dd.parse(dstr1).toString());
5.數(shù)據(jù)庫時區(qū)設(shè)置:
show variables like '%time_zone%';
mysql> set time_zone='+8:00';
修改后 select 結(jié)果(timestamp)轉(zhuǎn)換成相應(yīng)timezone時間展示织盼,DateTime字段不變化
插入的時間時轉(zhuǎn)換相應(yīng)的timezone時間插入