这个 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
变量。