C语言获取意大利当地时间比实际早3小时的问题排查
问题原因
你的代码存在两个核心错误,叠加后刚好导致时间比实际早3小时:
- 第一,POSIX标准中
TZ环境变量的偏移量规则写反了。TZ格式里的偏移量代表UTC时间减去本地时间的差值,意大利属于东1区(标准时UTC+1),正确的TZ值应该写为UTC-1,你写成UTC+1会被系统识别为西1区,直接导致时间比正确值少了2小时。 - 第二,
localtime函数返回的tm结构中的tm_hour已经自动根据tm_isdst的标记计算过夏令时偏移了,你手动给tm_hour加1的操作属于重复叠加夏令时,又多减了1小时。
如果你的运行环境自带时区数据库,更推荐直接使用Europe/Rome作为TZ值,不需要手动配置偏移和夏令时规则,兼容性更好。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 配置意大利时区,自带夏令时切换规则 setenv("TZ", "Europe/Rome", 1); tzset(); time_t sec = 1634224877; // 测试用时间戳 struct tm * end = localtime(&sec); printf("夏令时生效?: %d\n", end->tm_isdst); printf("当前时间: %.2d/%.2d/%d - %.2d:%.2d:%.2d\n", end->tm_mday, end->tm_mon + 1, end->tm_year + 1900, end->tm_hour, end->tm_min, end->tm_sec); return 0; }
内容的提问来源于stack exchange,提问作者StefanoN
相关产品推荐
相关产品推荐

