当前位置: 技术问答>linux和unix
让人苦恼的mktime问题
来源: 互联网 发布时间:2016-05-07
本文导语: 我在编写一个跨平台软件中发现时间函数mktime转换结果有差异: 在VxWorks下(使用gcc for arm编译器)设置时区为东八区,调用mktime将本地时间转换为UTC时间,结果转换出来的时间总是小3600s(一个小时),无奈之下,在win2000下用VC6...
我在编写一个跨平台软件中发现时间函数mktime转换结果有差异:
在VxWorks下(使用gcc for arm编译器)设置时区为东八区,调用mktime将本地时间转换为UTC时间,结果转换出来的时间总是小3600s(一个小时),无奈之下,在win2000下用VC6.0和BCB6.0测试,发现结果都不一样,VC6.0的结果是对的.代码如下:
struct tm *pt1,pt;
time_t tt;
char *ts;
/*当地时间1970年1月1日 8:00:01*/
pt.tm_year = 70;
pt.tm_mon = 0;
pt.tm_mday = 1;
pt.tm_hour = 8;
pt.tm_min = 0;
pt.tm_sec = 1;
tt = mktime(&pt);
win2000,VC6.0下:tt=1;正确
win2000,BCB6.0下tt=-1, 转换失败,设置pt.tm_hour=9,则tt=1;
vxworks,GCC_ARM下tt=1,正确
在当地时间1970年1月1日 8:00:01下,VC 和vxworks下GCC_ARM编译器结果一致,BCB6.0返回错误,但当
当地时间为2008年4月8日 19:53:32时
pt.tm_year = 108;
pt.tm_mon = 3;
pt.tm_mday = 8;
pt.tm_hour = 19;
pt.tm_min = 53;
pt.tm_sec = 32;
win2000,VC6.0下:tt=1207655612;正确
win2000,BCB6.0下 tt=1207652012;少一个小时
vxworks,GCC_ARM下tt=1207652012,少一个小时
请问是什么原因,该如何解决.
在VxWorks下(使用gcc for arm编译器)设置时区为东八区,调用mktime将本地时间转换为UTC时间,结果转换出来的时间总是小3600s(一个小时),无奈之下,在win2000下用VC6.0和BCB6.0测试,发现结果都不一样,VC6.0的结果是对的.代码如下:
struct tm *pt1,pt;
time_t tt;
char *ts;
/*当地时间1970年1月1日 8:00:01*/
pt.tm_year = 70;
pt.tm_mon = 0;
pt.tm_mday = 1;
pt.tm_hour = 8;
pt.tm_min = 0;
pt.tm_sec = 1;
tt = mktime(&pt);
win2000,VC6.0下:tt=1;正确
win2000,BCB6.0下tt=-1, 转换失败,设置pt.tm_hour=9,则tt=1;
vxworks,GCC_ARM下tt=1,正确
在当地时间1970年1月1日 8:00:01下,VC 和vxworks下GCC_ARM编译器结果一致,BCB6.0返回错误,但当
当地时间为2008年4月8日 19:53:32时
pt.tm_year = 108;
pt.tm_mon = 3;
pt.tm_mday = 8;
pt.tm_hour = 19;
pt.tm_min = 53;
pt.tm_sec = 32;
win2000,VC6.0下:tt=1207655612;正确
win2000,BCB6.0下 tt=1207652012;少一个小时
vxworks,GCC_ARM下tt=1207652012,少一个小时
请问是什么原因,该如何解决.
|
估计与tm_isdst有关.
[code=BatchFile]
A positive or 0 value for tm_isdst shall cause mktime() to presume initially that Daylight Savings
Time, respectively, is or is not in effect for the specified time. A negative value for tm_isdst
shall cause mktime() to attempt to determine whether Daylight Savings Time is in effect for the
specified time.
[/code]
试试tm_isdst设置为0或-1.
俺这里输出为:
1207655612
CST
1207655612
CST
1207652012
CST
[code=BatchFile]
A positive or 0 value for tm_isdst shall cause mktime() to presume initially that Daylight Savings
Time, respectively, is or is not in effect for the specified time. A negative value for tm_isdst
shall cause mktime() to attempt to determine whether Daylight Savings Time is in effect for the
specified time.
[/code]
试试tm_isdst设置为0或-1.
#include
#include
#include
int
main(void)
{
struct tm tm;
time_t clock;
memset(&tm, 0, sizeof(tm));
tm.tm_year = 108;
tm.tm_mon = 3;
tm.tm_mday = 8;
tm.tm_hour = 19;
tm.tm_min = 53;
tm.tm_sec = 32;
tm.tm_isdst = 0;
clock = mktime(&tm);
printf("%dn", (int)clock);
printf("%sn", tm.tm_zone);
memset(&tm, 0, sizeof(tm));
tm.tm_year = 108;
tm.tm_mon = 3;
tm.tm_mday = 8;
tm.tm_hour = 19;
tm.tm_min = 53;
tm.tm_sec = 32;
tm.tm_isdst = -1;
clock = mktime(&tm);
printf("%dn", (int)clock);
printf("%sn", tm.tm_zone);
memset(&tm, 0, sizeof(tm));
tm.tm_year = 108;
tm.tm_mon = 3;
tm.tm_mday = 8;
tm.tm_hour = 19;
tm.tm_min = 53;
tm.tm_sec = 32;
tm.tm_isdst = 1;
clock = mktime(&tm);
printf("%dn", (int)clock);
printf("%sn", tm.tm_zone);
return (0);
}
俺这里输出为:
1207655612
CST
1207655612
CST
1207652012
CST
|
同意楼上,很有可能是夏时制的问题,你可以确认一下当地是否有夏时制。