如何使当前时间与C中的时区变化相匹配

如何使当前时间与C中的时区变化相匹配,c,linux,C,Linux,我在一个基于Linux的路由器上工作。我正在开发一个C应用程序。我想在我的应用程序中连续获取当前时间 问题是,虽然我在应用程序启动后更改了时区,但它根据应用程序启动时区为我提供了时间。系统的时区已更改。Linux终端上的date命令显示不同的时区和日期/时间 time_t currTm; struct tm *loctime; char udrTime[50]; while (1) { currTm = time(NULL); loctime = localtime(&c

我在一个基于Linux的路由器上工作。我正在开发一个C应用程序。我想在我的应用程序中连续获取当前时间

问题是,虽然我在应用程序启动后更改了时区,但它根据应用程序启动时区为我提供了时间。系统的时区已更改。Linux终端上的
date
命令显示不同的时区和日期/时间

time_t currTm;
struct tm *loctime;
char udrTime[50];
while (1)
{
    currTm = time(NULL);
    loctime = localtime(&currTm);
    strftime(udrTime, sizeof(udrTime), "%Y-%m-%d %H:%M:%S", loctime);
    printf("udr_time = %s\n", udrTime);
    usleep(10000);
}  

我希望根据时区的变化进行输出。

要在应用程序中更改时区,只需设置
TZ
环境变量,无需其他任何操作:

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

void print_time(time_t t) {
    char buf[256];
    strftime(buf, sizeof buf, "%H:%M:%S", localtime(&t));
    printf("%s %s\n", getenv("TZ"), buf);
}

int main() {
    time_t t = time(NULL);

    setenv("TZ", "Europe/London", 1);
    print_time(t);

    setenv("TZ", "America/New_York", 1);
    print_time(t);

    return 0;
}


系统上是否设置了
TZ
环境变量?如果是,请在启动C应用程序之前尝试取消设置。我认为这在标准C中是不可能的。您可能必须依赖操作系统特定的API。可能在Linux中?是一个标准的Posix函数。另请参见和@jww之类的问题。此函数由其他依赖于时区的时间转换函数自动调用
tzset
更新通常不直接使用的
tzname
timezone
daylight
全局变量。调用时的条件是
tzname!=getenv(“TZ”)
。谢谢@Maxim。我在Posix规范中找不到该文本。我确实看到
tzset
似乎不是线程安全的,这在我看来有点不寻常。
Europe/London 15:48:58
America/New_York 10:48:58