在編寫代碼過程中,遇到一個問題,在服務器上寫入時間為:2021-09-22 08:00:00
,但在本機測試寫入的時間為:2021-09-22 00:00:00
。
首先是懷疑服務器上的時間不正確,但經驗證后發現不是:
$ date
# Output:Thu Sep 23 10:40:09 CST 2021 // 顯示的是當前時間
# 以下是解決辦法:
$ yum install ntpdate -y
$ ntpdate 0.asia.pool.ntp.org
其次懷疑服務器連接參數serverTimezone
寫錯了,但實際上沒有寫錯:
serverTimezone=GMT%2B8
查詢資料過程中,發現了一個易錯的地方,即前端取時間可能會少了8小時,通過以下代碼解決:
spring:
#解決前端取回日期少8個小時問題
jackson:
date-format: yyyy/MM/dd HH:mm:ss
time-zone: GMT+8
然后,通過設置Java程序的時區解決了問題,在SpringBoot啟動類中添加設置時區的方法:
@SpringBootApplication
public class Application {
@PostConstruct
void init() {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
}
public static void main(String[] args) {
SpringApplication.run(MallApplication.class, args);
}
}
最后,在查找具體原因的時候發現,由於代碼是部署在Docker容器中,而Docker容器中的時區是不正確的,如:
$ date
# Output:Thu Sep 23 03:13:55 UTC 2021 // 使用了UTC的時間
由於不想在容器中同步時間,所以使用設置Java程序的時區即可