linux下关于夏令时取时间戳的问题

csmtv csmtv 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
根据用户输入需要对应的日期转成时间戳传给程序,用的是struct tm赋值, mktime(&tm)转时间戳。
问题是,当系统的时区调到支持夏令时区时,(.e.g. GMT-5)则会在进出夏令时有问题,


测试程序如下:

//GMT-5

struct tm tm1;
struct tm tm2;
time_t clock;
//3-8 00:00

memset(&tm1, 0, sizeof(tm1));
memset(&tm2, 0, sizeof(tm2));
tm1.tm_year = 109;
tm1.tm_mon = 2;
tm1.tm_mday = 8;
tm1.tm_hour = 0;
tm1.tm_min = 0;
tm1.tm_sec = 0;
tm1.tm_isdst = 0;
printf("before: %04d-%02d-%02d %02d:%02d:%02d\n", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
printf("before: tm_isdst = %d\n", tm1.tm_isdst);
clock = mktime(&tm1);
printf("%d\n", (int)clock);
localtime_r(&clock, &tm2);
printf("after: %04d-%02d-%02d %02d:%02d:%02d\n", tm2.tm_year+1900,tm2.tm_mon+1,tm2.tm_mday,tm2.tm_hour,tm2.tm_min,tm2.tm_sec);
//printf("%s\n", tm1.tm_zone);


printf("------------------------------\n");

//11-2 00:00

memset(&tm1, 0, sizeof(tm1));
memset(&tm2, 0, sizeof(tm2));
tm1.tm_year = 109;
tm1.tm_mon = 10;
tm1.tm_mday = 1;
tm1.tm_hour = 0;
tm1.tm_min = 0;
tm1.tm_sec = 0;
tm1.tm_isdst = 0;
printf("before: %04d-%02d-%02d %02d:%02d:%02d\n", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
printf("before: tm_isdst = %d\n", tm1.tm_isdst);
clock = mktime(&tm1);
printf("%d\n", (int)clock);
localtime_r(&clock, &tm2);
printf("after: %04d-%02d-%02d %02d:%02d:%02d\n", tm2.tm_year+1900,tm2.tm_mon+1,tm2.tm_mday,tm2.tm_hour,tm2.tm_min,tm2.tm_sec);





当tm.tm_isdst = 0 (不启用夏令时)时,则进入夏令时OK,出夏令时会多一个小时。
root@UTM25:/opt/CPSecure/webui/private# ./test
before: 2009-03-08 00:00:00
before: tm_isdst = 0
1236488400
after: 2009-03-08 00:00:00
------------------------------
before: 2009-11-01 00:00:00
before: tm_isdst = 0
1257051600
after: 2009-11-01 01:00:00

当tm.tm_isdst = 1(启用夏令时) 时,则进入夏令时时间会提前一个小时,出夏令时OK。
root@UTM25:/opt/CPSecure/webui/private# ./test
before: 2009-03-08 00:00:00
before: tm_isdst = 1
1236484800
after: 2009-03-07 23:00:00
------------------------------
before: 2009-11-01 00:00:00
before: tm_isdst = 1
1257048000
after: 2009-11-01 00:00:00
...全文
评论 2
收藏 已收藏
分享
返回顶部
csmtv
C++ 语言 65,214 成员 250,514 内容