我的系统时区是亚洲/德黑兰,它有DST 更改调整夏季(春季向前),冬季向后;但是我确实需要禁用这些 DST 调整并将时区始终保持在 UTC+3:30。我该如何在 Linux 中做到这一点?
答案1
第 1 部分:更新操作系统时区
从2022年9月22日起,伊朗将废除夏令时,全年遵守标准时间。这第一的包含这些更新的官方包位于 IANA 的“tzdata2022b.tar.gz”包中,因此以下是如何从中应用亚洲/德黑兰地区时区更新的方法。
下载包tzdata2022b.tar.gz并将其解压;看如果您想获取最新的套餐,请点击此处查看所有套餐。
$ tar -xzvf tzdata2022b.tar.gz
通过“zic”(时区编译器)命令进行编译以应用感兴趣区域(亚洲)系统时区数据的更新(您应该root/root 特权用户):
# zic asia
笔记:这些更改将直接应用于亚洲/德黑兰以及亚洲其他地区。
使用以下命令验证更新是否正确应用,并且 DST 已禁用(请注意,在“Wed Sep 21 23:59:59”之后(回退到 +0330 作为伊朗标准时间),此后的日期将不会发生 DST 调整):
# zdump -v -c2022,2029 Asia/Tehran Asia/Tehran -9223372036854775808 = NULL Asia/Tehran -9223372036854689408 = NULL Asia/Tehran Mon Mar 21 20:29:59 2022 UTC = Mon Mar 21 23:59:59 2022 +0330 isdst=0 Asia/Tehran Mon Mar 21 20:30:00 2022 UTC = Tue Mar 22 01:00:00 2022 +0430 isdst=1 Asia/Tehran Wed Sep 21 19:29:59 2022 UTC = Wed Sep 21 23:59:59 2022 +0430 isdst=1 Asia/Tehran Wed Sep 21 19:30:00 2022 UTC = Wed Sep 21 23:00:00 2022 +0330 isdst=0 Asia/Tehran 9223372036854689407 = NULL Asia/Tehran 9223372036854775807 = NULL
/etc/localtime
使用以下命令将本地时间与更正的时区信息重新链接:# zic -l Asia/Tehran
验证
date
并hwclock
报告正确的日期和时间。
以下是如何构建和应用特定国家时区更新(此答案中为亚洲/德黑兰)的解决方案。
创建一个名为的自定义 ZONE 文件
Tehran_timeZone
,并添加以下区域信息(每个国家的规则和区域信息可以在 tzdata2022b.tar.gz 包中的相关区域文件中找到):$ cat Tehran_timeZone # Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Iran 1910 only - Jan 1 00:00 0 - Rule Iran 1977 only - Mar 21 23:00 1:00 - Rule Iran 1977 only - Oct 20 24:00 0 - Rule Iran 1978 only - Mar 24 24:00 1:00 - Rule Iran 1978 only - Aug 5 01:00 0 - Rule Iran 1979 only - May 26 24:00 1:00 - Rule Iran 1979 only - Sep 18 24:00 0 - Rule Iran 1980 only - Mar 20 24:00 1:00 - Rule Iran 1980 only - Sep 22 24:00 0 - Rule Iran 1991 only - May 2 24:00 1:00 - Rule Iran 1992 1995 - Mar 21 24:00 1:00 - Rule Iran 1991 1995 - Sep 21 24:00 0 - Rule Iran 1996 only - Mar 20 24:00 1:00 - Rule Iran 1996 only - Sep 20 24:00 0 - Rule Iran 1997 1999 - Mar 21 24:00 1:00 - Rule Iran 1997 1999 - Sep 21 24:00 0 - Rule Iran 2000 only - Mar 20 24:00 1:00 - Rule Iran 2000 only - Sep 20 24:00 0 - Rule Iran 2001 2003 - Mar 21 24:00 1:00 - Rule Iran 2001 2003 - Sep 21 24:00 0 - Rule Iran 2004 only - Mar 20 24:00 1:00 - Rule Iran 2004 only - Sep 20 24:00 0 - Rule Iran 2005 only - Mar 21 24:00 1:00 - Rule Iran 2005 only - Sep 21 24:00 0 - Rule Iran 2008 only - Mar 20 24:00 1:00 - Rule Iran 2008 only - Sep 20 24:00 0 - Rule Iran 2009 2011 - Mar 21 24:00 1:00 - Rule Iran 2009 2011 - Sep 21 24:00 0 - Rule Iran 2012 only - Mar 20 24:00 1:00 - Rule Iran 2012 only - Sep 20 24:00 0 - Rule Iran 2013 2015 - Mar 21 24:00 1:00 - Rule Iran 2013 2015 - Sep 21 24:00 0 - Rule Iran 2016 only - Mar 20 24:00 1:00 - Rule Iran 2016 only - Sep 20 24:00 0 - Rule Iran 2017 2019 - Mar 21 24:00 1:00 - Rule Iran 2017 2019 - Sep 21 24:00 0 - Rule Iran 2020 only - Mar 20 24:00 1:00 - Rule Iran 2020 only - Sep 20 24:00 0 - Rule Iran 2021 2022 - Mar 21 24:00 1:00 - Rule Iran 2021 2022 - Sep 21 24:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] Zone Asia/Tehran 3:25:44 - LMT 1916 3:25:44 - TMT 1935 Jun 13 # Tehran Mean Time 3:30 Iran +0330/+0430 1977 Oct 20 24:00 4:00 Iran +04/+05 1979 3:30 Iran +0330/+0430
有关配置参数的更多信息,请参阅“曼兹克”
编译以通过“zic”命令应用亚洲/德黑兰时区的更新:
$ zic Tehran_timeZone
/etc/localtime
使用以下命令将本地时间与更正的时区信息重新链接:# zic -l Asia/Tehran
笔记:根据您使用的 Linux 发行版,您需要重新配置系统在启动时使用的区域(使用tzdata-update
或进行配置timedatectl set-timezone Asia/Tehran
)
笔记:用户/外壳级别 timeZone默认情况下,在用户/外壳级别显示日期和时间时使用相同的命令
,但是如果变量设置为不同的值,那么它将读取并应用该变量中的时区,因此您需要取消设置/删除它或将其设置为用户级 shell 配置文件中的当前位置;这是一个命令,用于查找用户主目录下的文件中可能设置变量的文件:date
/etc/localtime
TZ
TZ
TZ='Asia/Tehran'
TZ
# find /home/ -maxdepth 2 -type f -exec grep -wH 'TZ' {} +
笔记:您将需要为系统范围的 shell 配置文件更新相同的内容。
第 2 部分:更新基于 Java 的应用程序(OpenJDK、OracleJDK、IBMJDK 等)的时区
您有一个更新的时区文件(https://data.iana.org/time-zones/releases/tzdata2022b.tar.gz)
您需要下载一个基于Java的编译器将
tzdata2022b.tar.gz
文件编译成Java兼容的时区;我们使用了开源的 ZIUpdater 工具(从https://www.azul.com/products/open-source-tools/ziupdater-time-zone-tool/)运行以下命令,使用工具从 tzdata2022b.tar.gz 包编译时区
ziupdater.jar
:$JAVA_HOME/bin/java -jar ziupdater.jar -l tzdata2022b.tar.gz
完毕。该工具将为 JDKv8+ 和 JDKv7 及更早版本
ziupdater.jar
生成 tzdb.dat (tzdb.dat 的原始位置为),它将生成一个名为(原始位置为)的目录,其中包含所有更新的时区文件,您只需替换旧的时区文件使用新时区(您可能需要先从旧时区进行备份)$JAVA_HOME/lib/tzdb.dat
zi
$JAVA_HOME/lib/zi/*
可能需要重新启动应用程序。
笔记:
修补时区后,一旦您需要:
- 取消设置
TZ
环境变量并重新启动sshd
服务。 - 重新启动
cron
/crond
服务。 - 重新启动
rsyslog
服务器运行的系统日志服务或任何其他系统日志服务。 - 某些应用程序(特别是数据库)可能既不使用操作系统也不使用 JDK 时区文件,为此,您需要单独参考其文档以了解具体操作方法。