新版本的 glibc returns 错误的时区

new version of glibc returns wrong timezone

这个 SO 线程 Why does glibc “timezone” global not agree with system time on DST? 不是我的问题的解决方案。

我的系统有 glibc 2.11.3,我为我的项目编译了 glibc 2.22。我运行make localedata/install-locales.

此 MCVE 仅在与旧 glibc 版本链接时显示正确的时间。将它链接到新的 glibc 版本,它显示 UTC 时间:

#include <time.h>
#include <stdio.h>

int main()
{
    struct tm * tmNow;
    time_t dtNow;
    char sBuffer [100];

    tzset();

    time( &dtNow );
    tmNow = localtime( &dtNow );

    strftime( sBuffer, sizeof(sBuffer), "%Y-%m-%d %T", tmNow );
    printf("%ld - %s\n", timezone, sBuffer);
}

当我尝试在新 glibc 版本的 bin/ 目录中 运行 tzselect 时,我得到这个错误:

./tzselect: line 171: /usr/glibc/share/zoneinfo/iso3166.tab: No such file or directory
./tzselect: time zone files are not set up correctly

差不多都说了,但目前我无法找出如何设置文件 /usr/glibc/share/zoneinfo/iso3166.tab

如何永久设置 new glibc 版本的时区?

我不想使用 TZ 变量!

更新: 使用 TZ 变量不会改变任何东西。我想我没有正确配置新的 glibc 版本。

更新:将现有的 /usr/share/zoneinfo 系统目录复制到新的 /usr/glibc/share/zoneinfo 目录至少解决了 TZ 变量的问题。但是只要 TZ 变量没有设置新的 glibc 版本就不能识别正确的时区。

我用 vi 打开了新的 libc.so.6 库并搜索了 localtime

glibc 版本寻找 localtime 的硬编码目录设置为 /usr/glibc/etc

然后这是一个简单的任务:我运行命令

ln -s /usr/share/zoneinfo/Europe/Vienna /usr/glibc/etc/localtime

现在 localtime 在新的 glibc 版本中被正确识别,无需使用 TZ 变量。