如何禁用时区的 DST 更改?

如何禁用时区的 DST 更改?

我的系统时区是亚洲/德黑兰,它有DST 更改调整夏季(春季向前),冬季向后;但是我确实需要禁用这些 DST 调整并将时区始终保持在 UTC+3:30。我该如何在 Linux 中做到这一点?

答案1

第 1 部分:更新操作系统时区

2022年9月22日起,伊朗将废除夏令时,全年遵守标准时间。这第一的包含这些更新的官方包位于 IANA 的“tzdata2022b.tar.gz”包中,因此以下是如何从中应用亚洲/德黑兰地区时区更新的方法。

  1. 下载包tzdata2022b.tar.gz并将其解压;看如果您想获取最新的套餐,请点击此处查看所有套餐

    $ tar -xzvf tzdata2022b.tar.gz
    
  2. 通过“zic”(时区编译器)命令进行编译以应用感兴趣区域(亚洲)系统时区数据的更新(您应该root/root 特权用户):

    # zic asia
    

    笔记:这些更改将直接应用于亚洲/德黑兰以及亚洲其他地区。

  3. 使用以下命令验证更新是否正确应用,并且 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

  4. /etc/localtime使用以下命令将本地时间与更正的时区信息重新链接:

    # zic -l Asia/Tehran
    
  5. 验证datehwclock报告正确的日期和时间。


以下是如何构建和应用特定国家时区更新(此答案中为亚洲/德黑兰)的解决方案。
  1. 创建一个名为的自定义 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
    

    有关配置参数的更多信息,请参阅“曼兹克

  2. 编译以通过“zic”命令应用亚洲/德黑兰时区的更新:

    $ zic Tehran_timeZone
    
  3. /etc/localtime使用以下命令将本地时间与更正的时区信息重新链接:

    # zic -l Asia/Tehran
    

笔记:根据您使用的 Linux 发行版,您需要重新配置系统在启动时使用的区域(使用tzdata-update或进行配置timedatectl set-timezone Asia/Tehran

笔记:用户/外壳级别 timeZone默认情况下,在用户/外壳级别显示日期和时间时使用相同的命令
,但是如果变量设置为不同的值,那么它将读取并应用该变量中的时区,因此您需要取消设置/删除它或将其设置为用户级 shell 配置文件中的当前位置;这是一个命令,用于查找用户主目录下的文件中可能设置变量的文件:date/etc/localtimeTZTZTZ='Asia/Tehran'TZ

# find /home/ -maxdepth 2 -type f -exec grep -wH 'TZ' {} +

笔记:您将需要为系统范围的 shell 配置文件更新相同的内容。


第 2 部分:更新基于 Java 的应用程序(OpenJDK、OracleJDK、IBMJDK 等)的时区

  1. 您有一个更新的时区文件(https://data.iana.org/time-zones/releases/tzdata2022b.tar.gz

  2. 您需要下载一个基于Java的编译器将tzdata2022b.tar.gz文件编译成Java兼容的时区;我们使用了开源的 ZIUpdater 工具(从https://www.azul.com/products/open-source-tools/ziupdater-time-zone-tool/

  3. 运行以下命令,使用工具从 tzdata2022b.tar.gz 包编译时区ziupdater.jar

    $JAVA_HOME/bin/java -jar ziupdater.jar -l tzdata2022b.tar.gz
    
  4. 完毕。该工具将为 JDKv8+ 和 JDKv7 及更早版本ziupdater.jar生成 tzdb.dat (tzdb.dat 的原始位置为),它将生成一个名为(原始位置为)的目录,其中包含所有更新的时区文件,您只需替换旧的时区文件使用新时区(您可能需要先从旧时区进行备份)$JAVA_HOME/lib/tzdb.datzi$JAVA_HOME/lib/zi/*

  5. 可能需要重新启动应用程序。

笔记:
修补时区后,一旦您需要:

  1. 取消设置TZ环境变量并重新启动sshd服务。
  2. 重新启动cron/crond服务。
  3. 重新启动rsyslog服务器运行的系统日志服务或任何其他系统日志服务。
  4. 某些应用程序(特别是数据库)可能既不使用操作系统也不使用 JDK 时区文件,为此,您需要单独参考其文档以了解具体操作方法。

相关内容