当前位置:  技术问答>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,少一个小时

请问是什么原因,该如何解决.

|
估计与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.

#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

|
同意楼上,很有可能是夏时制的问题,你可以确认一下当地是否有夏时制。

    
 
 

您可能感兴趣的文章:

  • 关于mktime()的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3