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

ARM嵌入式Linux夏令时转换出错,能否拷贝amd64的/usr/share/zoneinfo?

问题解答

核心结论

可以直接拷贝amd64系统的/usr/share/zoneinfo目录到你的ARM嵌入式Linux系统,以此获取完整的时区(含夏令时)支持,让timedatectl和strftime()正常工作。

原因说明

  • zoneinfo下的时区数据是跨平台的二进制格式,不依赖CPU架构(amd64/ARM),仅包含时区规则定义,ARM系统可直接读取解析。
  • 完成拷贝后只需两步配置即可生效:
    1. 创建/etc/timezone文件,写入目标时区名称(例如Asia/Shanghai)
    2. 执行timedatectl set-timezone 目标时区名命令,或创建软链接ln -sf /usr/share/zoneinfo/目标时区名 /etc/localtime

代码修正提示

你当前代码中timeValue被初始化为全0,会导致mktime处理1970年的无效时间。实际使用时需先将UTC时间戳转换为struct tm,再通过mktime处理夏令时转换,修正示例如下:

#include <time.h>
#include <stdbool.h>

char        dateTimeOut[128] = { 0 };
bool        isError = false;
struct tm   timeValue = { 0 };
time_t      utcTime = time(NULL); // 替换为你的实际UTC时间戳

do {
    // 线程安全方式将UTC时间戳转为struct tm(UTC时区)
    if (NULL == gmtime_r(&utcTime, &timeValue)) {
        isError = true;
        break;
    }
    // mktime自动根据系统时区(含夏令时)转换成本地时间
    if (-1 == mktime(&timeValue)) {
        isError = true;
        break;
    }
    isError = (0 == strftime(dateTimeOut, sizeof(dateTimeOut), "%a %d %b %Y %T", &timeValue));
} while (false);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:20:05