新版本的 glibc 返回错误的时区



这个 SO 线程 为什么 glibc "时区" 全局与 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 - %sn", 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

如何永久设置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 变量。

相关内容

  • 没有找到相关文章