造成這種問題的原因是:操作系統時區跟JVM的時區不一致。
[root@paas244 ~]# timedatectl
可以看到系統的時區是中國時區。
Local time: Thu 2016-12-29 15:35:44 CST
Universal time: Thu 2016-12-29 07:35:44 UTC
RTC time: Thu 2016-12-29 07:35:45
<strong>Time zone: Asia/Shanghai (CST, +0800)</strong>
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
可以看到系統的時區是中國時區。
java程序獲取的時間都是GMT時間(格林尼治時間(0時區的時間)),而系統是上海時間,應該是GMT+8,剛好相差8小時。網上搜了好多資料,只有兩種方法:
1、在程序中使用java的函數設定時區。
2、在啟動java程序時加參數-Duser.timezone=GMT+8
不過總不能去修改每個程序的源碼去設定時區吧。也不想在每個java程序啟動的時候加參數,太麻煩了。就沒有一勞永逸的辦法了?
開始以為jre應該會有某個配置文件保存了時區的配置,結果一無所獲。不過總有jre總要去系統中獲取時區配置吧。於是開始想是不是java用的是 linux中的系統配置文件?於是到linux系統下/etc/sysconfig目錄看時區配置。發現缺少了clock這個用於設置時區的文件。把別的 linux系統中的這個文件拷過來一試,ok。java程序的時間和系統時間一致了。看來jre是從/etc/sysconfig/clock這個文件中 獲取時區信息的。
附clock文件內容:
ZONE=”Asia/Shanghai”
UTC=false
ARC=false
ZONE — 時區
UTC — 表明時鍾設置為UTC。
ARC — 僅用於alpha表明使用ARC。
以上內容是網上搜集到的文章,我的解決方案是在程序中使用java的函數設定時區。
我需要的時間格式是:HH:mm。