聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

mktime之夏令时

2016-01-13 10:25 浏览: 6620 次 我要评论(0 条) 字号:

最近遇到了一件奇怪的事情,单元测试里写的一段代码在本地跑没有问题,放到Jenkins上跑就出问题。因为是跟时间相关的,所以一开始怀疑与时区有关系,跑到测试机上去看,时区配置的没有问题。代码逻辑很简单,如下:

#include <stdio.h>
#include <time.h>

int main(int argc, char** argv) {
    struct tm tm;
    char buf[255];

    strptime("2000-03-21 00:00:00", "%Y-%m-%d %H:%M:%S", &tm);

    time_t timestamp = mktime(&tm);

    strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
    puts(buf);
    return 0;
}

最后打印的时间与最初传入的时间可能并不一致。

追踪了半天,最后发现是tm.tm_isdst影响了结果的正确性。tm_isdst是用来描述是否是daylight saving time的属性,而strptime由于并不能确认是否是冬令时/夏令时,所以并没有置这个值,而是保留了其原有的默认值。而原有的默认值由于没有初始化,其值会影响mktime的行为,mktime会根据tm_isdst来修正tm中的各项值。

所以,在使用struct tm前,将其初始化成全0是最安全的。



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复