Linux

在 Linux 中禁用夏令時 (DST) 更改

  • October 26, 2016

幾週前,土耳其能源和自然資源部宣布 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 時間比 UTC3 小時,它應該比 UTC3 小時,如上面的輸出所示。

# 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

引用自:https://serverfault.com/questions/804403