在 Linux 中禁用夏令時 (DST) 更改
幾週前,土耳其能源和自然資源部宣布 DST 將是永久性的,而 GMT+3 將在該國永久使用。
目前,我們 Linux 伺服器的時區設置為Europe/Istanbul。但是尚未發布 tzdata 更新。
由於缺乏更新,時區將在 2016 年 10 月 30 日自動從 GMT+3 更改為 GMT+2,如 zoneinfo 文件 (/usr/share/zoneinfo/Europe/Istanbul) 中所述。
您可以在下面查看 2016 年的詳細資訊:
# zdump -v /usr/share/zoneinfo/Europe/Istanbul | grep 2016 /usr/share/zoneinfo/Europe/Istanbul Sun Mar 27 00:59:59 2016 UT = Sun Mar 27 02:59:59 2016 EET isdst=0 gmtoff=7200 /usr/share/zoneinfo/Europe/Istanbul Sun Mar 27 01:00:00 2016 UT = Sun Mar 27 04:00:00 2016 EEST isdst=1 gmtoff=10800 /usr/share/zoneinfo/Europe/Istanbul Sun Oct 30 00:59:59 2016 UT = Sun Oct 30 03:59:59 2016 EEST isdst=1 gmtoff=10800 /usr/share/zoneinfo/Europe/Istanbul Sun Oct 30 01:00:00 2016 UT = Sun Oct 30 03:00:00 2016 EET isdst=0 gmtoff=7200
(在沒有更新的情況下)為了防止這種情況變成危機,我們決定制定一個備份計劃,將我們伺服器的時區設置為固定的 GMT+3;但是當設置了固定的 GMT+3時,我們會遇到一個奇怪的行為。
在我們對時區進行任何更改之前,讓我們看看我們伺服器上的本地時間和 UTC 時間是多少。
# date Wed Sep 21 11:13:11 EEST 2016 # date -u Wed Sep 21 08:13:15 UTC 2016
我們將時區設置為固定的 GMT+3,如下所示:
# rm -f /etc/localtime # ln -s /usr/share/zoneinfo/Etc/GMT+3 /etc/localtime
讓我們看看更改後我們伺服器上的本地時間和UTC時間是多少。GMT+3 時間比 UTC早3 小時,它應該比 UTC晚3 小時,如上面的輸出所示。
# date Wed Sep 21 05:14:24 GMT+3 2016 # date -u Wed Sep 21 08:14:26 UTC 2016
即使我們重置本地時間或 UTC 時間,它也不會改變。
# date -s "21 Sep 2016 11:16:00" Wed Sep 21 11:16:00 GMT+3 2016 # date Wed Sep 21 11:16:02 GMT+3 2016 # date -u Wed Sep 21 14:16:05 UTC 2016 # date -u -s "21 Sep 2016 11:16:00" Wed Sep 21 11:16:00 UTC 2016 # date Wed Sep 21 08:16:01 GMT+3 2016 # date -u Wed Sep 21 11:16:02 UTC 2016
為什麼偏移量似乎是向後的?
**更新 #1:**時區數據庫更新最近在其官方儲存庫下針對多個作業系統發布。該版本
tzdata2016g
包括上述更改的設置。在某些時候,這個問題與superuser.com 上提出的問題重複。
清晰的答案是
“像 Etc/GMT+6 這樣的區域被有意反轉以向後兼容 POSIX 標準”
但我認為不應該刪除它以幫助想要在 Linux 系統中禁用 DST 更改的人。
要禁用 DST 更改,請將您的
/etc/localtime
文件連結到文件夾下的 zoneinfo 文件之一/usr/share/zoneinfo/Etc/
範例命令:
# ln -s /usr/share/zoneinfo/Etc/GMT+3 /etc/localtime
要選擇最合適的 zoneinfo 文件,請反轉您的目標 GMT 的符號。
即要設置 GMT+3 時區(比 UTC 早 3 小時),應該使用 /usr/share/zoneinfo/Etc/GMT-3