jvmlinux時區設定
# 背景
在接入集團一個平臺的時候,發現錄製某個介面到測試環境回放,發現介面入參一致,一個start_day 一個end_day,但回放的時候會多呼叫一次資料庫查詢,很是奇怪;
查閱業務程式碼,發現確實有邏輯會導致多查詢一次,於是重點觀察資料變化,發現錄製回放兩個時間不一致,相差12個小時;
繼續查閱業務日誌,發現在第一次查詢DB的時候,兩次的時間不一樣,就是說介面入參(String型別)一致,通過應用轉化為int型別的時候就出問題了的,相差12個小時;
因此猜測是時區問題!!!
# 思路&解決
1. 既然發現是時區問題,比較好搞咯,去到錄製機器A和回放機器B,通過linux命令檢視時區
date -R
發現都是Fri, 06 Jul 2018 12:11:22 +0800
都是+8,東八區
date +"%Z %z"
結果發現還是一致呀,都是CST +0800
2. 不對,時區一樣呀,那麼問題就是java執行不一樣? 核對了jdk版本,發現一致
3. 那麼就在兩臺機器上執行java程式碼試下:
System.out.println(TimeZone.getDefault()); //輸出當前預設時區
發現了問題了,兩臺機器列印的不一致,A是上海,而B是紐約。。。
4. 那麼問題變成了jvm從哪裡去獲取時區的呢?經過查詢大致如下:
1)如有環境變數 TZ設定,則用TZ中設定的時區
2) 在 /etc/sysconfig/clock檔案中找 “ZONE”的值
3)如2)都沒,就用/etc/localtime 和 /usr/share/zoneinfo 下的時區檔案進行匹配,如找到匹配的,就返回對應的路徑和檔名。
簡單來說就是:
TZ環境變數 –> /etc/sysconfig/clock檔案 –> /etc/localtime檔案 依次尋找
5. 於是開始設定了,TZ不管了,加了/etc/sysconfig/clock,如下操作:
新建一個/etc/sysconfig/clock,內容如下:
ZONE="Asia/Shanghai" UTC=false ARC=false
然後繼續去檢視時區,還是不對呀!!
6. 繼續設定/etc/localtime檔案,如下操作:
unlink /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
就是初始化/etc/localtime ,然後將東八區的繫結上
7. 在檢視時區成功了,重新執行java程式碼,發現正常了
8. 繼續翻閱資料,發現:
時區的配置檔案是/etc/sysconfig/clock。用tzselect命令就可以修改這個配置檔案,根據命令的提示進行修改就好了。
但是在實際工作中,發現這種方式是不能夠使得伺服器上的時間設定馬上生效的,而且使用ntpdate去同步時間伺服器也不能夠更改時間。即使你使用了 date命令手工設定了時間的話,如果使用ntpdate去進行時間同步的話,時間又會被改動到原來的錯誤時區的時間。而生產的機器往往是非常重要的,不能夠進行重啟等操作。
1)/etc/sysconfig/clock 檔案,只對 hwclock
命令有效,且只在系統啟動和關閉的時候才有用(修改了其中的 UTC=true 到 UTC=false 的前後,執行 hwclock (–utc,
或 –localtime) 都沒有變化,要重啟系統後才生效);
在 /etc/sysconfig/clock 中 UTC=false 時,date、hwclock、hwclcok –localtime 輸出的時間應該都一致,且此時 hwclock –utc是沒有意義的;在 /etc/sysconfig/clock 中 UTC=ture 時,date、hwclock 的輸出是一致的,hwclock –localtime 的輸出則是UTC時間;
系統關閉時會同步系統時間到硬體時鐘,系統啟動時會從硬體時鐘讀取時間更新到系統,這2個步驟都要根據 /etc/sysconfig/clock 檔案中UTC的引數來設定時區轉換。
意思就是修改/etc/sysconfi/clock是可行的,但是不會立即生效,需要重啟。那麼一切就說的通了
# 後記
參考資料:
https://www.nowcoder.com/questionTerminal/1e794493ad564324a16da1c47545c117
http://blog.51cto.com/5iwww/661863
https://my.oschina.net/huawu/blog/4646
http://linux.it.net.cn/CentOS/fast/2016/0511/21660.html
https://blog.csdn.net/splenday/article/details/47065557
https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
雖千萬人,吾往矣!
相關文章
- Docker映象時區設定Docker
- Azure Function 時區設定Function
- 設定openjdkdocker容器的時區JDKDocker
- MySQL中的時區設定MySql
- Linux設定和修改時間與時區Linux
- Django的時區設定問題Django
- 2.5.10.1 設定資料庫時區資料庫
- # 2020-10-06 #「Linux」- 時區設定Linux
- Ubuntu、CentOS修改時區、設定24小時時間格式教程。UbuntuCentOS
- alpine 映象設定時區的有效辦法
- Nodered學習記錄-時間戳和時區設定時間戳
- 如何在 Ubuntu Linux 中設定或更改時區UbuntuLinux
- Jenkins定時設定Jenkins
- Excel如何設定列印區域?Exce列印區域設定教程Excel
- 關於 MySQL 時區設定的一個常用 sql 命令MySql
- laravel8 時區設定無效解決辦法Laravel
- props設定state誤區
- MongoDB 超時設定MongoDB
- SSH 超時設定
- laydate設定預設時分秒
- 用 NTP 設定 CentOS 和 Ubuntu 伺服器的正確時區CentOSUbuntu伺服器
- Docker映象製作實戰:設定時區和系統編碼Docker
- CSocket設定超時(轉)
- 開機時的設定
- 路由器WiFi定時開關設定教程 路由器WiFi定時開關怎麼設定?路由器WiFi
- win10區域網設定密碼如何設定 win10區域網怎麼設定訪問密碼Win10密碼
- php 根據給定字串時間獲取時區PHP字串
- JMeter定時器設定延遲與同步JMeter定時器
- 小米9 SE定時開關機怎麼設定?小米9 SE定時開機關機設定方法教程
- MySQL不區分大小寫設定MySql
- 2.6.7 設定DDL鎖超時
- WinAppDriver 等待時間設定技巧APP
- localStorage設定過期時間
- linux系統時間設定Linux
- js時間顯示設定JS
- localStorage設定儲存時間
- redis設定過期時間Redis
- Linux下chrony對時設定Linux