ARM嵌入式Linux夏令时转换出错,能否拷贝amd64的/usr/share/zoneinfo?
问题解答
核心结论
可以直接拷贝amd64系统的/usr/share/zoneinfo目录到你的ARM嵌入式Linux系统,以此获取完整的时区(含夏令时)支持,让timedatectl和strftime()正常工作。
原因说明
zoneinfo下的时区数据是跨平台的二进制格式,不依赖CPU架构(amd64/ARM),仅包含时区规则定义,ARM系统可直接读取解析。- 完成拷贝后只需两步配置即可生效:
- 创建
/etc/timezone文件,写入目标时区名称(例如Asia/Shanghai) - 执行
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
相关产品推荐
相关产品推荐

