Loading... 这篇文章用来解决两个问题: 1. 如何更新操作系统的时区文件,让它得知目前最新的夏令时信息(这会依当局的行政命令而发生改变) 2. 如果遇到了时区信息错误,如何解决 第一个需求最为常见,然而第二个问题对于 CentOS 用户来说同样有一定意义。下次有其他倒霉蛋遇到这个问题的时候,就能从本文确定问题和修复方式了。 ## 问题 当你使用的应用不自己维护时区信息时,他们会从 Linux 系统的 tzdata,也就是系统的时区数据库读取这些信息。这一般依赖`$TZDIR`指示的路径(因此你可以通过这个环境变量修改它——如果你的应用程序足够聪明,知道先看看这个变量的话),如果没有指示,那么默认是`/usr/share/zoneinfo`目录。 如果你的场景强依赖**正确的夏令时数据**,那么你必须经常更新这个数据库。因为很多主体的夏令时每年并不一致,而这依赖于当局的行政命令,因此你需要根据新的公告数据去更新,以保证你的软件和现实世界表现一致。 如果你使用 **CentOS**,在某些涉及到时区的场景中,发现涉及 **Africa/Casablanca**(卡萨布兰卡)这个时区的数据总是不对,而其他绝大多数情况都是正常的,那么大概率是因为:这儿的 tzdata 本来就是坏的。 ## 如何解决 你需要做的是**更新系统的时区文件到一个正确/最新的版本**(取决于你的需求)。接下来是过程: 1. 首先你需要下载 IANA 时区数据库,这里我们就用最新的,其他也很容易在 [ICANN](https://mm.icann.org/pipermail/tz-announce/) 找到: ```bash wget https://www.iana.org/time-zones/repository/tzdb-latest.tar.lz ``` 2. 将其解压,然后完成 build 过程,这可能需要 C 编译环境: ```bash tar -xf tzdb-latest.tar.lz cd tzdb-2024a/ make TOPDIR="$HOME/tzdir" install # 决定编译到哪里 "$HOME/tzdir/usr/bin/zdump" -v America/Los_Angeles # 读一个文件验证一下 ``` 3. 然后你在`TOPDIR`给定的路径就得到了一份新的 tzdata 及相关文件。接下来需要用它们去覆盖本系统中的文件(如果需要,记得备份): ```bash sudo cp -r $YOUR_PATH/usr/share/zoneinfo /usr/share ``` 这就足够更新时区数据了。当然如果你需要更全面的更新,包括一些时区相关工具,那么你可以把`TOPDIR`所有的文件拷贝并覆盖到`/`目录对应位置下。 ## 参考资料 [Africa/Casablanca timezone missing #10211](https://github.com/ClickHouse/ClickHouse/issues/10211) [Africa/Casablanca timezone issue #1442](http://github.com/kimai/kimai/issues/1442) 作者在 SelectDB 的内部文档 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏