C语言 如何更改Linux进程时区

yduiuuwa  于 2023-02-15  发布在  Linux
关注(0)|答案(1)|浏览(196)

我有一个程序,它包含一个时间同步模块。该模块同步时间与一个新的时区和一个时间戳。它改变时区到一个新的,首先设置/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后,程序中的日期时间变得与系统时间相同。

5vf7fwbs

5vf7fwbs1#

如果希望libc在程序运行时从/etc重新读取时区信息,最简单的方法是:

#include <time.h>
#include <stdlib.h>

...
unsetenv("TZ");
tzset();

说明(手动设置):
tzset()函数的作用是:初始化TZ环境变量中的tzname变量。......如果TZ变量没有出现在环境中,则使用系统时区。系统时区可以通过复制或链接一个tzfile(5)格式的文件到/etc/localtime来配置。

相关问题