linux下关于夏令时取时间戳的问题
根据用户输入需要对应的日期转成时间戳传给程序,用的是struct tm赋值, mktime(&tm)转时间戳。
问题是,当系统的时区调到支持夏令时区时,(.e.g. GMT-5)则会在进出夏令时有问题,
测试程序如下:
当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
问题是,当系统的时区调到支持夏令时区时,(.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
...全文
相关推荐
llinux 夏令时与各种时间
在Linux系统中,时间管理是程序开发中必不可少的一部分。本文主要讨论了Linux环境下关于时间的表示、获取以及计时的方法。
linux下关闭和开启防火墙的命令
linux下关闭和开启防火墙的命令、linux下关闭和开启防火墙的命令
Linux下关闭tomcat
### Linux下关闭Tomcat在Linux环境中管理应用服务器如Tomcat是常见的运维操作之一。
Linux/Unix关于时间和时间戳的命令行
在实际应用中,理解时间戳和如何在命令行中处理它们对于排查问题、日志分析和自动化脚本编写至关重要。
linux上取cpuid的c代码
linux上取cpuid的c代码,可以直接编译........


