You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Linux系统时区与时间后程序时区未同步的问题排查

问题分析与解决方案

问题核心在于进程时区缓存机制:程序启动时会读取系统时区配置(/etc/localtime、/etc/timezone)并将其缓存到内存中,后续调用localtime_r、time等时间接口时,默认直接使用这份缓存,不会主动重新读取系统文件的变化。所以即使你修改了系统时区文件并设置了时间,当前进程的时区缓存还是旧的,导致获取的时间显示不符合预期;而重启程序会重新加载时区配置,因此恢复正常。

解决方法

在完成时区文件修改和系统时间设置后,主动调用tzset()函数,强制进程重新加载系统时区配置,更新内部缓存。

修改后的代码示例

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

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

    // 强制重新加载时区配置,更新进程内时区缓存
    tzset();

    return 0;
}

补充说明

  1. tzset()的作用:该函数会检查TZ环境变量,如果未设置则默认读取/etc/localtime的时区信息,重新初始化进程内部的时区相关全局变量(比如tzname、timezone、daylight),确保后续时间接口使用最新时区。
  2. 时区文件修改的正确性:修改/etc/timezone后,需要确保/etc/localtime是指向对应时区文件(比如/usr/share/zoneinfo/Asia/Shanghai)的软链接,否则tzset()无法正确识别新时区。
  3. 权限要求:无论是settimeofday还是date命令,都需要以root权限运行,否则会执行失败。

内容的提问来源于stack exchange,提问作者Walker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:40:58