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

vah*_*aha 12 linux daylight-saving timezone

几周前,(土耳其能源和自然资源部)宣布 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
Run Code Online (Sandbox Code Playgroud)

(在没有更新的情况下)为了防止这种情况成为危机,我们决定制定一个备份计划,将我们的服务器时区设置为固定 GMT+3;但是当设置了固定 GMT+3时,我们会遇到一个奇怪的行为。

在我们对时区进行任何更改之前,让我们看看我们服务器上的本地时间和 UTC 时间是多少。

# date
Wed Sep 21 11:13:11 EEST 2016
# date -u
Wed Sep 21 08:13:15 UTC 2016
Run Code Online (Sandbox Code Playgroud)

我们将时区设置为固定 GMT+3如下:

# rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/Etc/GMT+3 /etc/localtime
Run Code Online (Sandbox Code Playgroud)

让我们看看更改后我们服务器上的本地时间和 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
Run Code Online (Sandbox Code Playgroud)

即使我们重置本地时间或 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
Run Code Online (Sandbox Code Playgroud)

为什么偏移看起来是向后的?

vah*_*aha 12

更新 #1:最近为官方存储库下的几个操作系统发布了时区数据库更新。该版本tzdata2016g包括上述更改的设置。

在某些时候,这个问题是在 superuser.com提出的问题的重复。

清晰的答案是

“为了与 POSIX 标准向后兼容,像 Etc/GMT+6 这样的区域被有意反转”

但我认为不应该删除它来帮助想要在 Linux 系统中禁用 DST 更改的人。

要禁用 DST 更改,请将您的/etc/localtime文件链接到放置在文件夹下的 zoneinfo 文件之一。/usr/share/zoneinfo/Etc/

示例命令:

# ln -s /usr/share/zoneinfo/Etc/GMT+3 /etc/localtime
Run Code Online (Sandbox Code Playgroud)

要选择最合适的 zoneinfo 文件,请反转目标 GMT 的符号。

即要设置 GMT+3 时区(比 UTC 提前 3 小时),应使用 /usr/share/zoneinfo/Etc/GMT-3