1. 程式人生 > >JavaWeb 專案與系統時間相差 8 個小時的問題

JavaWeb 專案與系統時間相差 8 個小時的問題

開發十年,就只剩下這套架構體系了! >>>   

寫在前面

今天記錄分享一個排查部署到 Linux 上的 web 專案執行的時間和本地系統時間相差 8 小時的問題

環境:redhat 6.5 考慮有規律的時間差可能和時區不同有關

1 檢視 Linux 系統時間和時區

[root@localhost ~]# date
2019年 03月 31日 星期日 16:00:32 CST
[root@localhost ~]# date -R
Sun, 31 Mar 2019 16:00:44 +0800
[root@localhost ~]# date +"%Z %z"
CST +0800

從這裡可以確定,系統的時間和時區正常(北京時間,也就是東八區),時區詳情請看這裡

2 檢視 jvm 時間和時區

2.1 先在 Linux 上某個目錄執行 javac ,看 javac 命令是否可用,出現如下顯示就可以(中間部分已省略)

[root@localhost test]# javac
用法: javac <options> <source files>
其中, 可能的選項包括:
  -g                         生成所有除錯資訊
  -g:none                    不生成任何除錯資訊
  -g:{lines,vars,source}     只生成某些除錯資訊
  ......
  -X                         輸出非標準選項的提要
  -J<標記>                     直接將 <標記> 傳遞給執行時系統
  -Werror                    出現警告時終止編譯
  @<檔名>                     從檔案讀取選項和檔名

2.2 編寫測試程式

import java.util.TimeZone;
import java.util.Date;

public class time {
    public static void main(String[] args) {
        System.out.println("當前時間:"+new Date());
        System.out.println("當前預設時區:"+TimeZone.getDefault());
    }
}

2.3 編譯執行

[root@localhost test]# javac time.java 
[root@localhost test]# ll
總用量 8
-rw-r--r-- 1 root root 780 3月  31 16:02 time.class
-rw-r--r-- 1 root root 239 3月  31 16:00 time.java
[root@localhost test]# java time
當前時間:Sun Mar 31 08:02:34 CTM 2019
當前預設時區:sun.util.calendar.ZoneInfo[id="GTM",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]

這裡有導其他的包,如果以上命令不好使,則使用如下命令 (中間的點 . 是當前目錄的意思)

[root@localhost test]# javac -d . time.java
[root@localhost test]# ll
總用量 8
-rw-r--r-- 1 root root 780 3月  31 16:03 time.class
-rw-r--r-- 1 root root 239 3月  31 11:00 time.java
[root@localhost test]# java -cp . time
當前時間:Sun Mar 31 08:02:40 CST 2019
當前預設時區:sun.util.calendar.ZoneInfo[id="GTM",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]

這裡顯然 jvm 的時間比系統的時間早了 8 個小時,且是格林威治的時區,所以這裡修改 jvm 的時區即可,這裡說下,網上查詢說 jvm 的時區預設讀取的是硬體時區,目錄為 /etc/sysconfig/clock (詳情),檢視如下

[root@localhost test]# cat /etc/sysconfig/clock 
ZONE="Asia/Shanghai"

與網上對比,這裡沒有下面這兩行

UTC=false
ARC=false

這裡看有人說是沒有設定 UTC=false 導致的問題,檢視資料說 UTC 指定 BIOS 中儲存的時間是否是 GMT/UTC 時間,true 表示 BIOS 裡面儲存的時間是 UTC 時間,false 表示 BIOS 裡面儲存的時間是本地時間。 加上後有的機器還是不好使,如果是在 tomcat 下執行的專案,那就重啟 tomcat 即可。

如果還不好使,還有修改 tomcat 配置檔案的方法,歡迎參考之前的文章:Tomcat修改日期的時區

現在問題基本已解決,以上有些內容是客戶現場出現的,所以現在記錄時也是憑筆記和記憶回憶的,如有偏差也請不吝賜教。

文章參考:https://blog.csdn.net/liqinghuiyx/article