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

csmtv 2009-06-15 11:13:04
根据用户输入需要对应的日期转成时间戳传给程序,用的是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
...全文
810 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
neohope 2009-06-15
  • 打赏
  • 举报
回复
美国和加拿大原本于每年10月的最后一个星期日凌晨2时起实施冬令时间;4月的第一个星期日凌晨2时起,恢复夏令时间。

这可够夸张的,不好办,
kingteng 2009-06-15
  • 打赏
  • 举报
回复
我觉得这样才对啊
当tm.tm_isdst = 0 (不启用夏令时)时,则进入夏令时OK,出夏令时会多一个小时。
当tm.tm_isdst = 1(启用夏令时) 时,则进入夏令时时间会提前一个小时,出夏令时OK。
有什么问题?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧