mktime之夏令时
最近遇到了一件奇怪的事情,单元测试里写的一段代码在本地跑没有问题,放到Jenkins上跑就出问题。因为是跟时间相关的,所以一开始怀疑与时区有关系,跑到测试机上去看,时区配置的没有问题。代码逻辑很简单,如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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是最安全的。
近期评论