我有一个程序,它包含一个时间同步模块。该模块同步时间与一个新的时区和一个时间戳。它改变时区到一个新的,首先设置/etc/timezone和/etc/localtime,然后设置系统时间使用时间戳。
我尝试了两种方法来设置系统时间:
int set_time(uint64_t ts) {
#if 0
//first method
struct timeval tv;
tv.tv_sec = ts;
tv.tv_usec = 0;
if (settimeofday(&tv, NULL) != 0) {
return -1;
}
#else
//second method
char cmd[256];
snprintf(cmd, sizeof(cmd), "date -s @%lld", ts);
if (system(cmd) != 0) {
return -1;
}
#endif
return 0;
}
这两种方法都不起作用。调用此函数后,系统时间根据时间戳和新时区更改,但程序中打印的日期时间似乎仍使用旧时区。(我使用API时间和localtime_r获得当前日期时间。)然而,重新启动程序后,程序中打印的日期时间开始与系统时间相同。
我想要的是在我调用时间同步API后,程序中的日期时间变得与系统时间相同。
1条答案
按热度按时间5vf7fwbs1#
如果希望libc在程序运行时从/etc重新读取时区信息,最简单的方法是:
说明(手动设置):
tzset()函数的作用是:初始化TZ环境变量中的tzname变量。......如果TZ变量没有出现在环境中,则使用系统时区。系统时区可以通过复制或链接一个tzfile(5)格式的文件到/etc/localtime来配置。