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是最安全的。
近期评论