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

时间:2016-02-11 16:43:34

标签: timezone glibc

这个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);
}

当我尝试在新tzselect版本的bin/目录中运行glibc时,出现此错误:

./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版本就无法识别正确的时区。

1 个答案:

答案 0 :(得分:0)

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

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

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

  

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

现在,localtime版本在新版glibc版本中无法正确识别TZ,而不使用null变量。